Rails fields_for返回nil

时间:2017-01-27 18:22:14

标签: ruby-on-rails ruby-on-rails-4 fields-for

想想我在编写它的过程中解决了这个问题。我将在下面发布我的解决方案。

tl; dr Rails fields_for不生成预期的参数。

我有一个User类,其代码如下:

class User < ActiveRecord::Base
  has_one :woojit, dependent: :destroy, validate: true
  accepts_nested_attributes_for :woojit

  # ... more
end

和Woojit类

class Woojit < ActiveRecord::Base
  belongs_to :user
end

我们的UsersController包含这个方法(我们使用gem管理员,但它是Rails&#39; ApplicationController的子类):

class WoojitsController < Admin::ApplicationController
  def new
    # ... other stuff
    @woojit = @user.build_woojit
  end
end

我们的用户_form.html.erb部分看起来像这样:

<%= form_for([namespace, page.resource], html: { class: "form" }) do |f| %>

  <!-- User fields -->

  <fieldset>
    <legend>Woojit fields</legend>
    <%= f.fields_for @woojit do |ff| %>
      <%= render 'woojit_fields', f: ff %>
    <% end %>
  </fieldset>
<% end %>

因此,当我提交表单时,我希望看到的是这个子集的params哈希:

{
  "user" => {
    "woojit_attributes" => {
       "attr_1"=>"Foo", # etc
    }
  }
}

但我在创建动作中实际得到的是这个子集的params哈希:

{
  "user" => {
    "woojit" => {
       "attr_1"=>"Foo", # etc
    }
  }
}

&&#39; woojit&#39;而不是&#39; woojit_attributes&#39;。我可以在创建动作中破解它,但这似乎是一种解决问题的可怕方法。我想知道为什么密钥首先被错误命名。

我最初尝试使用行<%= f.fields_for :woojit do |ff| %>(即符号而不是实例var),而不是在#new动作中构建Woojit对象。

{1}}在“一对一”部分中建议这应该有效,但是块中的代码从未执行过,因此行返回nil - 并且woojit params从未成功以任何形式创建动作。

1 个答案:

答案 0 :(得分:0)

所以问题显然是#fields_for在给定模型实例(@woojit)时的行为不同,而不是符号(:woojit)。

在前一个实例中,它生成引用(模型名称)的字段,例如:

<input type="text" name="user[woojit][woojit_attr]" id="user_pledge_pledgor_name" />

在后一种情况下,它会生成引用模型属性的字段字段,例如:

<input type="text" name="user[woojit_attributes][woojit_attr]" id="user_pledge_attributes_pledgor_name" />

希望拯救某人一些我刚刚经历过的挫折!