前提・実現したいこと
Rails5 でTwitterのようなものの管理画面を作っています.
リプライ機能を作っているところなのですがcreateアクションをするとバリデーションのエラーが出てきて解決方法が分かりません.
上の画像のようにセレクトボックスからどの投稿がどの投稿に対してリプライをするか選べるようにしたいです.
このページを参考にフォロー機能を作成し,ユーザー同士をつなげる要領で投稿同士をつなげればできるのではないかと考えてリプライ機能の作成を試みました.
わかりにくい説明で大変申し訳ないのですがよろしくお願いいたします.
発生している問題・エラーメッセージ
ActiveRecord::RecordInvalid (バリデーションに失敗しました: Repliedを入力してください):
該当のソースコード
モデル
post.rb
class Post < ApplicationRecord # 関連 belongs_to :virtual_user has_many :replies, dependent: :destroy has_many :replyings, through: :replies, source: :replied has_many :passive_replies, class_name: 'Reply', foreign_key: 'reply_id', dependent: :destroy has_many :replieds, through: :passive_replies, source: :post # バリデーション validates :body, presence: true validates :date, presence: true validates :virtual_user_id, presence: true end
reply.rb
class Reply < ApplicationRecord # 関連 belongs_to :post belongs_to :replied, class_name: 'Post' end
ビュー
new.html.erb
<h1>リプライの追加</h1> <%= render 'error_message', reply: @reply %> <%= form_with model: @reply, url: teacher_replies_path, local: true do |form| %> <%= form.label :post_id, 'リプライされる投稿' %> <%= form.collection_select(:post_id, @posts, :id, :body, {prompt: "どの投稿に返信しますか"}) %> <br> <%= form.label :reply_id, 'リプライする投稿' %> <%= form.collection_select(:reply_id, @posts, :id, :body, {prompt: "なんと返信しますか"}) %> <br> <%= form.submit "新規作成をする" %> <% end %> <%= link_to "一覧に戻る", teacher_replies_path %>
コントローラー
replies_controller.rb
class Teacher::RepliesController < ApplicationController before_action :set_posts, only: [:new, :create] def index @replies = Reply.all end def new @reply = Reply.new end def create @reply = Reply.new(post_id: params[:reply][:post_id], reply_id: params[:reply][:reply_id]) if @reply.save! flash[:success] = "作成しました." redirect_to teacher_replies_path else render new_teacher_reply_path end end private def set_posts @posts = Post.all end end
補足情報(FW/ツールのバージョンなど)
windows10
ruby 2.6.5
Rails 5.2.6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/15 16:02