Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails表单中初始化嵌套字段的正确方法_Ruby On Rails_Ruby_Model View Controller - Fatal编程技术网

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?第一种方法在嵌套表单的情况下失败。嵌套对象将被重新初始化,嵌套表单可能无法通过验证。