想想我在编写它的过程中解决了这个问题。我将在下面发布我的解决方案。
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从未成功以任何形式创建动作。
答案 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" />
希望拯救某人一些我刚刚经历过的挫折!