【问题标题】:Dynamic Forms with Cocoon - undefined method `reflect_on_association' for NilClass:Class:带有 Cocoon 的动态表单 - NilClass:Class 的未定义方法“reflect_on_association”:
【发布时间】:2019-12-13 20:40:00
【问题描述】:

我使用 cocoon gem 构建一些动态表单,我可以在其中添加新的文本字段。我读过其他人同样的问题,但我不知道我做错了什么,我知道它必须与协会有关,但我似乎不明白。

这些是我的模型:

class MonitorCategory < ActiveRecord::Base

  validates :operation, presence: true
  attr_accessor :oid, :oid2, :oids, :snmp_oper, :custom_tab_name, :custom_tab_unit, :redfish, :ipmi
  has_many :oids
  has_and_belongs_to_many :sensors

  accepts_nested_attributes_for :oids

class Oid < ActiveRecord::Base
  belongs_to :monitor_category
 end

还有我的表格:

<%= simple_form_for(:monitor_category, url: create_monitor_category_path, :html => { :remote => true, :method => :post }) do |f| %>
<div id='oids'>
    <%= f.simple_fields_for :oids do |oid| %>
    <%= render 'oids_fields', :f => oid %>
    <% end %>
    <div class='links'>
      <%= link_to_add_association 'add oid', f, :oids %>
    </div>
</div>

带有部分 _oids_fields.html.erb:

<div class='nested-fields'>
<%= f.input :oids %>
</div>

我做错了什么?我得到 NilClass:Class: 的未定义方法“reflect_on_association”。形式没问题,因为我正在查看 cocoon 的页面并且语法相同,所以我想它一定与关联有关,但我真的不知道,我对 Rails 世界有点陌生。也许因为它说 nilClass,我需要为 Oid 模型创建一个控制器,我在其中创建一个新方法或其他东西?我迷路了。

显然这也不起作用,我有同样的错误:

class OidController < ApplicationController

  def new
    @oid = Oid.new
  end

end  

感谢您的每一个回答。

编辑:只是为了更清楚,因为我很困惑。

在尝试实现这个动态表单之前,我已经有一个可以正常工作的表单。例如,最后两个字段是:

      <div class="col-md-12">
        <%= f.input :oid, label: 'SNMP OID', as: :search, placeholder: 'Output stored in var1.', required: false, novalidate: true, input_html: {data: { autocomplete_source: get_oids_path }} %>
      </div>
      <div class="col-md-12">
        <%= f.input :oid2, label: 'SNMP OID 2', as: :search, placeholder: 'Output stored in var2.', required: false, novalidate: true, input_html: {data: { autocomplete_source: get_oids_path }} %>
      </div>

所以基本上这里我存储模型中属性 :oid 和 :oid2 上输入的值。

但是我不想拥有这两个字段,我只想拥有一个,并且更动态地添加,所以我可以输入例如 6 个值并将它们全部保存在 :oids 属性中。由于我将值保存在属性上,所以我不知道是否必须像以前那样为 Oid 创建一个模型,并将其设为belong_to monitor_category。或者,如果我可以将属性 :oids 添加到控制器并将所有值存储在该变量中。

【问题讨论】:

  • 不要在模型中使用attr_accessor,除非您有非常具体的原因(绝不应该包括覆盖关系或属性)。我担心您通过添加attr_accessor :oids 而造成了某种形式的歧义,而has_many 并没有覆盖这一点。因此model.oids #=&gt; nil 因为方法实际上是def oids; @oids; end
  • 是的,我之前改过,但我仍然有同样的错误。为什么如果我这样做返回零?可能是oid控制器有问题? Oid.reflect_on_association(:owner) 这应该返回 MonitorCategory,因为我将 belongs_to 放在 Oid 类中。

标签: ruby-on-rails ruby forms dynamic apache-cocoon


【解决方案1】:

问题出在这一行

simple_form_for(:monitor_category, url: create_monitor_category_path, :html => { :remote => true, :method => :post }) do |f| 

这会为MonitorCategory 创建一个表单,但不会设置对象。因此,当您随后调用 f.simple_fields_for 时,没有对象可以迭代关联。

通常在控制器中设置@monitor_category 实例变量,该变量设置为现有实例(编辑时)或新创建的项目。

然后你可以写:

simple_form_for(@monitor_category, :html => { :remote => true, :method => :post }) do |f| 

Rails 足够聪明,可以从对象中推断出 url,它要么创建一个新的,要么更新一个现有的。

够清楚了吗?

【讨论】:

  • 您好,谢谢您的回答。我之前考虑过,但是如果我删除 de url 并将其更改为 @monitor_category,就像我在 edit_monitor_category 上所做的那样,效果很好,我会得到一个“未定义的方法 model_name por nil:NilClass。事情我是在使用其他人很久以前完成的代码,所以也许他们有理由放:monitor_category。我仍然不明白为什么如果我这样做@oid = Oid.new 会得到 nil
  • 此外,如果这是问题所在,其他 f.inputs 是否也会失败,因为“f”正如你所说的那样为零?
  • nil 不是f,而是f.object。控制器中是否设置了@monitor_category?如果这仅用于new 操作(通常表单在新建和编辑之间共享),您也可以编写simple_form_for MonitorCategory.new, ..(但仅用于测试)。供参考:stackoverflow.com/questions/5181143/…
【解决方案2】:

我认为这是因为您的表单是针对 monitor_category 的,而 url 指向 create_monitor_category_path。但是您向我们展示了OidController。你需要类似的东西:

class MonitorCategoryController < ApplicationController
  def new
    @monitor_category = MonitorCategory.new
    @monitor_category.oids.build
  end
end

这将初始化父对象,然后建立子关联。在使用字段时,您需要为字段显示至少一个子项。

【讨论】:

  • 你好,我更新了我的帖子,解释了我想要做什么,因为这不起作用而且我有同样的错误。感谢您的宝贵时间。
  • 如果您想使用您发布的带有茧的表单,该表单需要在monitor_category新视图中。然后它将动态地将子 oid 构建到父 monitor_category 上。您的表单未指向您的 oid 控制器。
  • 是的,我知道。我的动态表单是 new_monitor_category 视图的一部分,这不是问题。问题是我什至无法加载该视图,因为错误“反映我不知道如何解决的关联”。我将继续搜索信息,因为我在这里无处可去,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多