【问题标题】:Cocoon Gem: undefined method `new_record?' for nil:NilClass on link_to_remove_association茧宝石:未定义的方法`new_record?对于 nil:NilClass on link_to_remove_association
【发布时间】:2013-10-08 03:45:43
【问题描述】:

我正在尝试使用 Cocoon Gem 构建嵌套表单。但是我收到如下所示的错误。我在这里找到了另一个已回答的问题Rails Cocoon Gem: Undefined Method 'new_record?' on link_to_remove_association with Wicked。但是,正如您从我的模型代码中看到的那样,唯一的答案已经被排除在外。

错误

 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

【问题讨论】:

  • 您是否尝试将 f 替换为 @template ?我认为删除表单没有任何意义。
  • 我试过了,但是从我阅读的代码来看,f 不应该引用@template。它的房间。
  • 啊,没错。我的意思是你传递的是表单生成器而不是对象。所以尝试使用f.object 访问底层模型实例。
  • cocoon 实际上在f 上调用.object.new_record?,传递f.object 也无济于事。

标签: ruby-on-rails ruby ruby-on-rails-4 cocoon-gem


【解决方案1】:

这里的错误是simple_fields_for 没有链接到表单对象。所以写

<%= f.simple_fields_for :rooms do |room| %>

【讨论】:

    【解决方案2】:

    Cocoon 正在尝试执行f.object.new_record?,从显示的错误消息中,很明显f.objectnil

    我发现问题出在new 操作中。您已经构建了一个空白的 Template 对象,但没有任何 room 与之关联。你必须这样做 -

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多