вложенные формы и кокон. неопределенный метод `label’ для nil: NilClass

#ruby-on-rails #ruby #ruby-on-rails-4 #nested-forms #cocoon-gem

#ruby-on-rails #ruby #ruby-on-rails-4 #вложенные формы #кокон-драгоценный камень

Вопрос:

Привет всем. Когда я открываю /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
  

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

Комментарии:

1. Вы используете simple_form_for , я думаю, это должно быть <%= f.simple_fields_for :prices do |p|%>

2. Спасибо, Паван. Это работает!

3. С моим предложением или с ответом г-на Йошидзи?

4. с вашим предложением тоже. Ваше предложение решает основную проблему

Ответ №1:

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

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

должно быть

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

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

Комментарии:

1. Полезно, спасибо. Кстати, Паван, ты можешь помочь мне решить одну проблему с gem ‘cocoon’?

2. @DmitrySharikov Если это проблема с драгоценным камнем, я не могу, потому что я ничего не знаю о cocoon gem.

3. Этот ответ не решил вопрос. Ваш ответ не дает решения для undefined method 'label' for nil:NilClass ошибки.

Ответ №2:

В вашем _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 %>
  

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

Комментарии:

1. Одно сомнение. fields_for Разрешено ли использовать с simple_form_for also ?

2. Я догадался сам. Спасибо за помощь!

3. @Pavan simple_form_for является расширением уже существующего form_for . simple_fields_for предоставил бы больше возможностей и использовал simple_form_for синтаксис для определения новых полей ввода.

4. Спасибо за информацию. На самом деле я этого не знал. Но OP сказал, что он работает с моим предложением, поэтому undeleted я отвечаю.

5. Я знаю, что у меня достаточно репутации, чтобы увидеть удаленные ответы. Я просто опубликовал этот комментарий, чтобы сообщить другим людям, имеющим ту же проблему, что ваш ответ ее не решает