在Rails表单中初始化嵌套字段的正确方法

时间:2011-12-09 23:43:46

标签: ruby-on-rails ruby model-view-controller

我想了解初始化模型嵌套字段的“正确”方法是什么。

假设您有一些模型的嵌套字段:

class User

  has_one :address   
  accepts_nested_attributes_for :address
end

您需要初始化这些属性(在这种情况下为address),以便在fields_for调用中使用它们。

到目前为止,我已经想到了三种方法。

首先,after_initialize挂钩模型:

class User
  after_initialize :init_address

  protected
  def init_address
    address ||= build_address
end

然后我们在控制器中进行了初始化:

class UsersController
  def new    
    @user = User.new
    @user.build_address
  end
end

最后,我们可以有一个帮助方法为我们做这件事:

module FormHelpers
  def setup_user(user)
    user.address ||= user.build_address
    user
  end
end

# view

<%= form_for setup_user(@user)... %>

这种情况是否有类似标准或“最佳做法”的内容?你是怎么做到的,为什么?

2 个答案:

答案 0 :(得分:2)

我认为如果没有父模型,嵌套属性根本没有意义,那么这些嵌套模型的构建和初始化应该是父模型的责任。

我不明白为什么UsersController应该关心如何构建或初始化@user.addresses。对我来说,给控制器这个责任,可能意味着在create他应该是解析和构​​建嵌套属性的那个(在模型中发生)。

我会选择第一种方法。

答案 1 :(得分:0)

我相信在你声明一个has_one关联之后,build_address已经内置了rails,因此你不需要自己编写那个位。 如果仅从新动作调用表单,那么你真正需要的只是控制器位,而不是其他任何东西