前提・実現したいこと
form_withでの投稿で失敗した際に、タグに入力していた情報をそのまま保持しておくやり方をご教授いただきたいです。
発生している問題・エラーメッセージ
今回はpostコントローラーを経由してのform投稿なので、postモデルに入っている情報の入力情報保持はできているのですが、中間テーブルを経由してのタグ情報の入力情報の保持が上手く実装できていない状況です。
該当のソースコード
・app/views/post/new.html.slim
.container .row .col-md-6.col-12.offset-md-3 .card .card-body = render 'form', post: @post
・app/views/post/_form.html.slim
= form_with model: post, local: true, id: 'posts_form' do |f| = render 'shared/error_messages', object: post .form-group = f.label :images = f.file_field :images, multiple: true, class: 'form-control' - post.images.each do |image| = image_tag image.url, size: '100x100', class: 'image-thumbnail' .form-group = f.label :body = f.text_area :body, class: 'form-control' .form-group = f.label :tag - post.tags.each do |tag| = f.text_field :tag_name,value: @tag_list, class: 'form-control' = f.submit class: 'btn btn-primary btn-raised'
・app/controller/posts_controller.rb
class PostsController < ApplicationController . . . def new @post = Post.new end def create @post = current_user.posts.new(post_params) @tag_list = params[:post][:tag_name].split(',') if @post.save @post.save_tags(@tag_list) redirect_to posts_path, success: '投稿しました' else flash.now[:danger] = '投稿に失敗しました' render :new end end . . . private def post_params params.require(:post).permit(:body,tags: [],tag_maps: [], images: []) end end
・app/models/post.rb
class Post < ApplicationRecord belongs_to :user mount_uploaders :images, PostImageUploader serialize :images, JSON validates :images, presence: true validates :body, presence: true, length: { maximum: 1000 } has_many :tag_maps, dependent: :destroy has_many :tags, through: :tag_maps has_many :comments, dependent: :destroy has_many :likes, dependent: :destroy has_many :like_users, through: :likes, source: :user has_one :activity, as: :subject, dependent: :destroy scope :body_contain, ->(word) { where('body LIKE ?', "%#{word}%") } # タグ機能のロジック def save_tags(sent_tags) current_tags = tags.pluck(:tag_name) unless self.tags.nil? old_tags = current_tags - sent_tags new_tags = sent_tags - current_tags old_tags.each do |old_name| tags.delete Tag.find_by(tag_name: old_name) end new_tags.each do |new_name| post_tag = Tag.find_or_create_by(tag_name: new_name) tags << post_tag end end end
・db/migrate/20210501062533_create_tags.rb
class CreateTags < ActiveRecord::Migration[5.2] def change create_table :tags do |t| t.string :tag_name, null: false, uniqueness: true t.timestamps end end end
試したこと
post_controllerのcreateアクション時に、postモデルに中間テーブルtag_mapで紐づけているtagモデルからtag_tameをインスタンス変数(@tag_list)に代入し、その@tag_listを_form.html.slimのタグ入力欄にvalue: @tag_listで代入したのですが、これだと保持することになっていない様で、編集した際にタグ情報が予めformに入力されないという問題も発生してしまいました。
またこちらの2記事を参考にしてみたのですが、私の知識不足で上手く実装することができず…
↓
Formに入力した値を維持したままリロードする方法
【Rails】投稿失敗時にフォームに入力していた値を保持したい
恐れ入りますがご教授していただけますと助かります。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
rails 5.2.3
ruby 2.6.4
mysql2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。