Ruby on rails 嵌套属性,将当前_user.id传递给嵌套模型

Ruby on rails 嵌套属性,将当前_user.id传递给嵌套模型,ruby-on-rails,ruby-on-rails-3,nested-attributes,Ruby On Rails,Ruby On Rails 3,Nested Attributes,我有3个模型:用户、答案和问题 user.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 在questions/show.html.erb中 form_for @question do |f|

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

user.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
在questions/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

Submit调用questionsupdate操作,多亏了嵌套资源,新答案将保存在数据库中。我想知道:提交问题后,如何在数据库中保存用户id列以供回答?提交表单后,我是否可以通过某种方式将current\u user.id传递给answer的user\u id列?

“current\u user”是一种设计助手方法。它可以在控制器n视图中直接访问。 如果我没有错,只有新答案应该具有当前用户id。旧答案不应该更新。你可以这样做

f.fields_for :answers, @question.answers.build do |a|
  a.hidden_field :user_id, :value => current_user.id
  a.submit

“当前用户”是一种设计助手方法。它可以在控制器n视图中直接访问。 如果我没有错,只有新答案应该具有当前用户id。旧答案不应该更新。你可以这样做

f.fields_for :answers, @question.answers.build do |a|
  a.hidden_field :user_id, :value => current_user.id
  a.submit

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

# 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
另一个更简单的解决方案是将用户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

这种方法的问题在于,用户可以通过类似于chrome中的HTML源代码检查器来编辑值,从而将用户设置为其他人。当然,您可以通过某种方式对此进行验证,但这也有点复杂。

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

# 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
另一个更简单的解决方案是将用户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

这种方法的问题在于,用户可以通过类似于chrome中的HTML源代码检查器来编辑值,从而将用户设置为其他人。当然,您可以通过某种方式对此进行验证,但这也有点复杂。

您必须在控制器的“创建”操作中传递用户参数,还应在控制器中构建嵌套属性:

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

结束

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

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

结束

提交后为什么需要这样做?其他选项是什么?在提交前在表格中执行我可以添加答案。提交后为什么需要这样做?其他选项是什么?在提交前在表格中执行我可以添加答案。这不起作用,因为这不是通过表格发送的。您必须为用户id创建一个隐藏字段才能使其工作。这不起作用,因为这不是通过表单发送的。您必须为用户id创建一个隐藏字段,才能使其工作。这将需要应答的attr\u accessible中的用户id。不太安全,没错。。。嗯,我会考虑一个更好的解决方案,在Answer的attr\u accessible中需要用户id。不太安全,没错。。。嗯,我会为我考虑一个更好的解决方案,在创建操作中添加`@question.answers.first.user=current_user`,但它只保存第一个答案。如果您尝试添加多个答案,如。它救不了你。我试过做@question.answers.user=current_user,但也不起作用。如果您想通过问题表单创建多个答案,而不在表单中插入用户id的隐藏字段,您该怎么做?`因此,对我来说,在创建操作中添加`@question.answers.first.user=current_user`是可行的,但它只保存第一个答案。如果您尝试添加多个答案,如。它救不了你。我试过做@question.answers.user=current_user,但也不起作用。如果您想通过问题表单创建多个答案,而不在表单中插入用户id的隐藏字段,您该如何做`