Думаю, я решил это в процессе написания. Я отправлю свое решение ниже.Rails fields_for return nil
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 включает в себя этот метод (мы используем камень администрировать, но это подкласс ApplicationController Rails'):
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
}
}
}
Т.е. 'woojit' вместо 'woojit_attributes'. Я мог бы взломать это в действии create, но это кажется ужасным способом решения проблемы. Я хочу знать, почему ключ начинается с неправильного названия.
Первоначально я попробовал использовать альтернативу линии <%= f.fields_for :woojit do |ff| %>
(то есть символ вместо экземпляра var), а не для создания объекта Woojit в #new-действии.
#fields_for guide предлагает в разделе One-To-One, что это должно работать, но код в блоке не был выполнен, так что линия вернулась nil
- и woojit PARAMS никогда не делали это к созданию действия в любой форме ,