гнездовые формы и кокон. неопределенный метод `метка' для nil:NilClass

Всем привет. Когда я открываю /courses/new (или /courses/some_id/edit), браузер возвращает эту ошибку:

Showing /app/views/dashboard/courses/_price.html.erb where line #1 raised:
undefined method `label' for nil:NilClass

Вот коды, _form.html.erb:

 <%= simple_form_for [:dashboard, @course], html: { multipart: true } do |f| %>

//////
<%= f.fields_for :prices do |p|%>
  <%= render 'price', :f => 'prices' %>
<% end %>
<%= link_to_add_association 'Add', f, :prices %>

////////

_price.html.erb:

<%= p.label :price %>
<%= p.text_field :price %>
<%= p.label :desc %>
<%= p.text_field :description %>
<%= link_to_remove_association "remove", f %>

Модели:

class Price < ActiveRecord::Base
  belongs_to :course
end
class Course < ActiveRecord::Base
 has_many :prices
 accepts_nested_attributes_for :prices, :reject_if => :all_blank, :allow_destroy => true
end

Как решить эту ошибку? А почему оно возникло?


person DmitrySharikov    schedule 18.06.2014    source источник
comment
Вы используете simple_form_for, я думаю, это должно быть <%= f.simple_fields_for :prices do |p|%>   -  person Pavan    schedule 18.06.2014
comment
Спасибо, Паван. Оно работает!   -  person DmitrySharikov    schedule 18.06.2014
comment
С моим предложением или с ответом мистера Йошиджи?   -  person Pavan    schedule 18.06.2014
comment
с вашим предложением тоже. Ваше предложение решить основную проблему   -  person DmitrySharikov    schedule 18.06.2014


Ответы (2)


Вы используете simple_form_for, так что я предполагаю, что эта строка

<%= f.fields_for :prices do |p|%>

должно быть

<%= f.simple_fields_for :prices do |p|%>

Загляните в Git для получения дополнительной информации.

person Pavan    schedule 18.06.2014
comment
Полезно, спасибо. Кстати, Паван, не могли бы вы помочь мне решить одну проблему с драгоценным камнем «кокон»? - person DmitrySharikov; 18.06.2014
comment
@DmitrySharikov Если это проблема с драгоценным камнем, то я не могу, потому что ничего не знаю о драгоценном коконе. - person Pavan; 18.06.2014
comment
Этот ответ не решил вопрос. Ваш ответ не дает решения для ошибки undefined method 'label' for nil:NilClass. - person MrYoshiji; 18.06.2014

В вашем частичном представлении _price.html.erb вы используете конструктор форм, который не существует (это nil), потому что вы не передали его в качестве аргумента:

# _price.html.erb
<%= p.label :price %>
   #^ the variable `p` is the form builder here

Чтобы решить эту проблему, вы должны передать конструктору формы частичное представление, например:

<%= f.fields_for :prices do |p| %>
  <%= render 'price', :f => 'prices', p: p %>
                                     #^^^^ We pass the variable `p` (form builder) to the partial
<% end %>

Надеюсь это поможет!

person MrYoshiji    schedule 18.06.2014
comment
Одно сомнение. Можно ли использовать fields_for также с simple_form_for? - person Pavan; 18.06.2014
comment
Я догадался сам. Спасибо за помощь! - person DmitrySharikov; 18.06.2014
comment
@Pavan simple_form_for является расширением уже существующего form_for. simple_fields_for предоставит больше возможностей и будет использовать синтаксис simple_form_for для определения новых полей ввода. - person MrYoshiji; 18.06.2014
comment
Спасибо за информацию. На самом деле я этого не знал. Но ОП сказал, что это работает с моим предложением, поэтому я undeleted отвечаю. - person Pavan; 18.06.2014
comment
Я знаю, что у меня достаточно репутации, чтобы увидеть удаленные ответы. Я просто публиковал этот комментарий, чтобы сообщить другим людям, имеющим ту же проблему, что ваш ответ ее не решает. - person MrYoshiji; 18.06.2014