0

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列を追加することだと思いますが、それらの間に「関連付け」がないため、間違った解決策だと思います。

4

1 に答える 1

0

あなたの最初の問題は問題ではありません。それを行う方法はあまりありません。

2番目の問題、あなたはこのようにしなければなりません

@comment = @answer.comments.build(params[:comment][:content].merge(user_id: params[:comment][:user_id], answer_id: params[:comment][:answer_id])) そうしないと、テーブルにない属性を割り当てようとするためです。

またはあなたは別の方法を行うことができます

params[:comment].delete('question_id')

その後

@comment = @answer.comments.build(params[:comment])
于 2013-03-26T20:55:45.230 に答える