捕获current_user.id可以保存深层嵌套的记录

时间:2012-05-02 18:30:36

标签: ruby-on-rails

假设我的工作表格如下所示

=form_for @survey do |f|
  =f.text_field :name
  =f.fields_for :questions do |question_fields|
    =question_fields.text_field :question_text
      =question_fields.fields_for :answers do |answer_fields|
        =answer_fields.text_field :answer_text

由于表单的不同部分可以由不同的用户添加和更新,我需要一种方法在保存之前将user_id导入每个模型。我意识到能够访问模型中的current_user并不符合mvc,这就是说我没有解决方案。

如果我只保存一个对象,那么将current_user.id分配给控制器中的对象就足够了,但是考虑到这种形式的深层嵌套特性,它看起来像一个丑陋的解决方案。

有没有一种专家/铁路方式来处理这个问题?

Rails 3.2,设计

1 个答案:

答案 0 :(得分:1)

每个对象都不能简单地从他们的“父母”关系中窃取user_id吗?这是一种常见的模式:

class Answer < ActiveRecord::Base
  before_validation :assign_user_id

protected
  def assign_user_id
    # Don't attempt if the question is not defined,
    # or the user_id field is already populated.
    return unless (self.question or self.user)

    self.user_id = self.question.user_id
  end
end

这涉及一些额外的数据库活动来解决每个问题的答案,因为在范围内创建它是不够的,但它使它非常简单。

创建每条记录时,您可能想要做的是user_id参数中的内容。这意味着您的create调用需要在:user_id密钥中合并。但是,默认情况下,嵌套的帮助程序不会执行此操作,因此,如果您正在使用它,则可以将其保留为assign方法。