2017-01-27 9 views
0

Думаю, я решил это в процессе написания. Я отправлю свое решение ниже.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 никогда не делали это к созданию действия в любой форме ,

ответ

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

Надеюсь, что это избавит кого-то от разочарования, которое я только что пережил!

 Смежные вопросы

  • Нет связанных вопросов^_^