Railsアプリには、views / questions / show.html.erbページがあります。このページには、予想される@question変数に加えて、特定の質問に対するすべての回答を表示する@answers変数にもアクセスできます。
特定の質問に対するすべての回答を表示するループ内に、ユーザーがコメントできる領域を表示したいので(質問ではなく回答に対して)、別のSOのアドバイスに従ってコメント部分を作成しました。回答、変数を渡すための「ローカル」ハッシュを作成しました。コメントコントローラーの作成アクションで、回答(コメントは回答に属します)と質問(has_many:answers)にアクセスしたいので、私は答えと質問IDをそのように部分的に渡しました
<% for answer in @answers %>
....(code ommitted)
<%= render :partial => 'comments/form', :locals => { :answer_id => answer.id, :question_id => @question.id } %>
...(code ommitted)
<% end %>
そして、私はanswer_idとquestion_idをコメントの隠しフィールドに渡します。
<%= simple_form_for @comment do |f| %>
<%= f.input :content, as: :text, label: 'comment'%>
<%= f.hidden_field :user_id, :value => current_user.id %>
<%= f.hidden_field :answer_id, :value => answer_id %>
<%= f.hidden_field :question_id, :value => question_id %>
<%= f.button :submit %>
<% end %>
コメントコントローラーの作成アクションでは、これを行います
def create
@question = Question.find(params[:comment][:question_id])
@answer = Answer.find(params[:comment][:answer_id])
@comment = @answer.comments.build(params[:comment])
if @comment.save
flash[:notice] = "Successfully created comment"
redirect_to root_path
# redirect_to question_answers_path(@question) (will eventually want to redirect to the question)
else
render :action => 'new'
end
end
最初の問題は、次のように質問ID(および回答ID)を抽出する必要があるため、何か厄介なことをしたように感じます。
@question = Question.find(params[:comment][:question_id])
ただし、これらは私のフォームを送信した結果として利用できるパラメータです
Parameters: {"utf8"=>"✓", "authenticity_token"=>"VtogfCsI137lbk2l64RXtrfRn/+Rt1/jM8pfDVY29gM=", "comment"=>{"content"=>"test", "user_id"=>"12", "answer_id"=>"25", "question_id"=>"22"}, "commit"=>"Create Comment"}
だから私はこのようにquestion_idを掘り下げる必要がありますparams[:comment][:question_id]
2番目のより挑戦的な問題(私にとって挑戦的)は、Railsが私に言っていることです
Can't mass-assign protected attributes: question_id
コメントモデルにquestion_idを保存する理由がないため、データベースにその列を作成しませんでした。しかし、私がこれを行うとき
@comment = @answer.comments.build(params[:comment])
question_idは:comment内のパラメーターの1つであるため(フォームに非表示フィールドを作成することで取得しました)、Railsはコメントテーブルに保存しようとしています。ただし、comments_controller.rbの作成アクションで質問にアクセスしたい唯一の理由は、保存後に質問にリダイレクトするためにそれを使用することです。
この問題を解決するために私にできることを提案できますか?Railsの経験があまりないので、すべてがぎこちなくやっているような気がします。これが、Railsが機能しない理由かもしれません。この問題を解決する簡単な方法は、コメントモデルにquestion_id列を追加することだと思いますが、それらの間に「関連付け」がないため、間違った解決策だと思います。