Rails字段_用于返回nil



我想我在写的过程中已经解决了这个问题。我会在下面发布我的解决方案。

tl;drRails字段_用于未生成预期参数。

我有一个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包括这个方法(我们使用的是gemAdministrate,但它是Rails的ApplicationController的子类):

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

我们的user_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
}
}
}

即"woojit"而不是"woojit_attributes"。我可以在创建操作中破解这个,但这似乎是解决问题的可怕方法。我想知道为什么钥匙一开始就被误名了。

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

#fields_for指南在"一对一"部分中建议,这应该有效,但块中的代码从未执行过,因此该行返回nil-并且woojit参数从未以任何形式进入创建操作。

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

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

<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" />

希望这能让别人从我刚刚经历的挫折中解脱出来!

相关内容

  • 没有找到相关文章

最新更新