1

我有 3 个模型:用户、答案和问题。

用户.rb

 has_many :questions
 has_many :answers

问题.rb

 has_many :answers
 belongs_to :user
 accept_nested_attributes_for :answers

答案.rb

 belongs_to :question
 belongs_to :user

在问题/show.html.erb

 form_for @question do |f|
   f.fields_for :answers, @question.answers.build do |builder|
     builder.text_area, :body
   end

   f.submit
 end

提交调用 questions#update 操作,并且由于嵌套资源,新答案是否会保存在数据库中。我想知道:提交问题后,如何将user_id答案列保存在数据库中?提交表格后,我可以以某种方式传递current_user.id到答案栏吗?user_id

4

3 回答 3

5

您必须在控制器的创建操作中传递用户参数(您也应该在控制器中构建嵌套属性):

def new
  @question = Question.new
  @question.answers.build
end

def create
  @question = current_user.questions.new(params[:questions])
  //The line below is what will save the current user to the answers table 
  @question.answers.first.user = current_user

  ....
end 

因此,您的视图形式应如下所示:

form_for @question do |f|
   f.fields_for :answers do |builder|
     builder.text_area, :body
 end

 f.submit

结尾

于 2013-07-16T21:00:33.463 回答
1

您可以在控制器的更新操作中执行以下操作:

# questions_controller
def update
   params[:question][:answers_attributes].each do |answer_attribute|
     answer_attribute.merge!(:user_id => current_user.id)
   end

  if @question.update_attributes(params[:question])
    ...
  end
end

另一个更简单的解决方案是将 user_id 添加到您的表单中,如下所示:

form_for @question do |f|
  f.fields_for :answers, @question.answers.build(:user_id => current_user.id) do |builder|
    builder.text_area, :body
    builder.hidden_field :user_id # This will hold the the user id of the current_user if the question is new
  end

  f.submit
end

这种方法的问题在于,用户将能够通过 HTML 源代码检查器(如 chrome)编辑值,从而将用户设置为其他人。您当然可以通过某种方式验证这一点,但这也有点复杂。

于 2013-06-20T13:00:20.010 回答
-2

'current_user' 是一种设计辅助方法。它可以直接在控制器 n 视图中访问。如果我没有错,只有新答案应该有 current_user.id 旧答案不应该被更新。你可以这样做

f.fields_for :answers, @question.answers.build do |a|
  a.hidden_field :user_id, :value => current_user.id
  a.submit
于 2013-06-20T12:59:47.767 回答