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