我想我在写的过程中已经解决了这个问题。我会在下面发布我的解决方案。
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" />
希望这能让别人从我刚刚经历的挫折中解脱出来!