model_a.build_model_b与model_a.model_b.build之间的区别

时间:2014-02-18 18:30:15

标签: ruby-on-rails ruby-on-rails-4 nested-forms

“用户”有一个“移动”。我希望用户在“/ user /(:id)/ edit”页面上编辑他们的移动。

这意味着我有一个has_one关系的嵌套表单。如果“move”不存在,则表单的嵌套部分将不会显示。为确保存在,您经常会在控制器中看到@user.build_move@user.move.build

我的问题是@user.build_move@user.move.build在语义上有什么不同?第一个工作正常,而第二个返回错误undefined method build'为nil:NilClass`。

以下是示例代码:

在用户#edit view

<%= form_for @user do |u| %>
  <p>Test A</p>
  <%= u.fields_for :move do |m| %>
    <p>Test B</p>
    <%= m.date :start_date %>
  <% end %>
<% end %>

在用户#edit controller

  def edit
    @user = User.find(params[:id])
    @user.move.build # Causes `undefined method `build' for nil:NilClass`
  end

1 个答案:

答案 0 :(得分:1)

尝试在您的控制器中执行此操作

def edit
    @user = User.find(params[:id])
    @user.build_move
end
关联上的

build仅适用于has_many关联

例如,如果您的user has many roles,则可以说

@user.roles.build

但是@user.build_roles无效