2013-10-08 3 views
0

Я пытаюсь построить вложенную форму с помощью Cocoon Gem. однако я получаю ошибку, как показано ниже. Я нашел еще один ответ на этот вопрос: Rails Cocoon Gem: Undefined Method 'new_record?' on link_to_remove_association with Wicked. Однако единственный ответ уже исключен, как вы можете видеть из моего кода модели.Cocoon Gem: неопределенный метод `new_record? ' for nil: NilClass on link_to_remove_association

Ошибка

ActionView::Template::Error (undefined method `new_record?' for nil:NilClass): 
     1: <div class="nested-fields"> 
     2:  <%=f.input :name%> 
     3:  <%= link_to_remove_association "remove task", f%> 
     4: </div> 
     app/views/templates/_room_fields.html.erb:3:in `_app_views_templates__room_fields_html_erb__1867913568926009508_70125979350780' 
     app/views/templates/_form.html.erb:5:in `block (2 levels) in _app_views_templates__form_html_erb__4123974558704004784_70125994949300' 
     app/views/templates/_form.html.erb:4:in `block in _app_views_templates__form_html_erb__4123974558704004784_70125994949300' 
     app/views/templates/_form.html.erb:1:in `_app_views_templates__form_html_erb__4123974558704004784_70125994949300' 
     app/views/templates/new.html.erb:1:in `_app_views_templates_new_html_erb___3689493092838604682_70125964273280'Models 

Модели

class Template < ActiveRecord::Base 
     has_many :rooms 
     accepts_nested_attributes_for :rooms, :allow_destroy => true 
    end 
class Room < ActiveRecord::Base 
     belongs_to :template 
     has_many :items 
     accepts_nested_attributes_for :items, :allow_destroy => true 
    end 
class Item < ActiveRecord::Base 
     belongs_to :room 
    end 

Форма выпуска

<%= simple_form_for @template do |f| %> 
    <%= f.input :name%> 
    <div id="rooms"> 
     <%= simple_fields_for :rooms do |room| %> 
      <%= render 'room_fields',:f => room %> 
     <%end%> 
     <div class="links"> 
      <%= link_to_add_association 'add room', f, :rooms%> 
     </div> 
    </div> 
<%end%> 

номер Частичный

<div class="nested-fields"> 
     <%=f.input :name%> 
     <%= link_to_remove_association "remove task", f%> 
</div> 

Контроллер

class TemplatesController < ApplicationController 
    def new 
    @template = Template.new 
    end 

    def create 
    end 
end 
+0

Вы пытались заменить 'f' на' @ template'? я не думаю, что удаление формы имеет смысл. – phoet

+0

Я пробовал, но f из моего чтения кода не должен ссылаться на @template. его номера. – gsueagle2008

+0

ах да, это правда. я имею в виду, что вы передаете форму-строитель, а не объект. поэтому попробуйте использовать 'f.object' для доступа к экземпляру базовой модели. – phoet

ответ

0

кокон пытается выполнить f.object.new_record? и от сообщения об ошибке показаны, то ясно, что f.object является nil.

Я вижу, что проблема в действии new. Вы создали пустой объект Template, но с ним не связано room. Вы должны это сделать -

def new 
    @template = Template.new 
    @template.rooms.build 
end 
1

Ошибка здесь в том, что simple_fields_for не связана с формой-объекта. Поэтому пишите

<%= f.simple_fields_for :rooms do |room| %> 
Смежные вопросы