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

Fed*_*les 8 ruby model-view-controller ruby-on-rails

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

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

class User

  has_one :address   
  accepts_nested_attributes_for :address
end
Run Code Online (Sandbox Code Playgroud)

并且您需要初始化这些属性(address在本例中)以在fields_for调用中使用它们.

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

首先,after_initialize挂钩模型:

class User
  after_initialize :init_address

  protected
  def init_address
    address ||= build_address
end
Run Code Online (Sandbox Code Playgroud)

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

class UsersController
  def new    
    @user = User.new
    @user.build_address
  end
end
Run Code Online (Sandbox Code Playgroud)

最后,我们可以使用辅助方法为我们做到这一点:

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

# view

<%= form_for setup_user(@user)... %>
Run Code Online (Sandbox Code Playgroud)

对于这种情况,是否有类似标准或"最佳实践"的内容?你是怎么做到的,为什么?

Shu*_*hen 0

我相信在声明 has_one 关联后, build_address 已经内置于 Rails 中,因此您不需要自己编写该位。如果仅从新操作调用表单,那么您真正需要的只是控制器位,而不是其他