Ruby on rails 在Rails表单中初始化嵌套字段的正确方法
我想了解初始化模型嵌套字段的“正确”方法是什么 假设模型有一些嵌套字段:Ruby on rails 在Rails表单中初始化嵌套字段的正确方法,ruby-on-rails,ruby,model-view-controller,Ruby On Rails,Ruby,Model View Controller,我想了解初始化模型嵌套字段的“正确”方法是什么 假设模型有一些嵌套字段: class User has_one :address accepts_nested_attributes_for :address end 您需要初始化这些属性(在本例中为address),以便在调用的字段中使用它们 到目前为止,我已经想到了三种方法 首先,初始化后钩住模型: class User after_initialize :init_address protected def i
class User
has_one :address
accepts_nested_attributes_for :address
end
您需要初始化这些属性(在本例中为address
),以便在调用的字段中使用它们
到目前为止,我已经想到了三种方法
首先,初始化后
钩住模型:
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)... %>
模块FormHelpers
def设置_用户(用户)
user.address | |=user.build|u地址
用户
结束
结束
#看法
对于这种情况,是否有类似于标准或“最佳实践”的东西?你是如何做到的,为什么要这么做?我相信在你声明一个有一个关联之后,rails已经内置了build\u address,所以你不需要自己写那个位。
如果表单仅从新操作调用,那么您真正需要的只是控制器位,其他什么都不需要我认为如果嵌套属性在没有父模型的情况下毫无意义,那么这些嵌套模型的构建和初始化应该由父模型负责
我不明白为什么userscoontroller
应该关心@user.addresses
是如何构建或初始化的。对我来说,赋予控制器这一职责,可能意味着在create
上,他应该是解析和构建嵌套属性(发生在模型中)的人
我会选择第一种方法。代码中有一个输入错误,而不是build\u address
该方法应该被称为init\u address
。希望现在更清楚。我以为是@user.addresses.build
?@macek:对于一个项目(有一个关系),您使用build\u字段。对于多个项目(有多个),您确实使用了fields.build。@FedericoBuiles谢谢;我没有意识到这是一种
has\u one关系。由于缺乏更好的解决方案,我最终写了一篇gem来处理这个问题:看起来像一篇旧文章。您使用的是哪个版本的Rails?第一种方法在嵌套表单的情况下失败。嵌套对象将被重新初始化,嵌套表单可能无法通过验证。