我想了解初始化模型嵌套字段的“正确”方法是什么。
假设您有一些模型的嵌套字段:
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)... %>
这种情况是否有类似标准或“最佳做法”的内容?你是怎么做到的,为什么?
答案 0 :(得分:2)
我认为如果没有父模型,嵌套属性根本没有意义,那么这些嵌套模型的构建和初始化应该是父模型的责任。
我不明白为什么UsersController
应该关心如何构建或初始化@user.addresses
。对我来说,给控制器这个责任,可能意味着在create
他应该是解析和构建嵌套属性的那个(在模型中发生)。
我会选择第一种方法。
答案 1 :(得分:0)
我相信在你声明一个has_one关联之后,build_address已经内置了rails,因此你不需要自己编写那个位。 如果仅从新动作调用表单,那么你真正需要的只是控制器位,而不是其他任何东西