Rails,Cocoon Gem - NilClass:Class 的未定义方法“reflect_on_association”
Rails, Cocoon Gem - undefined method `reflect_on_association' for NilClass:Class
我正在尝试为我的 Rails 5 应用程序中的嵌套表单设置 cocoon gem。
我遇到了其他人发布的问题,但似乎对他们有用的解决方案对我不起作用。
我有地址、组织和设置的模型。这些协会是:
地址
belongs_to :addressable, :polymorphic => true, optional: true
组织
has_many :addresses, as: :addressable
accepts_nested_attributes_for :addresses, reject_if: :all_blank, allow_destroy: true
设置
has_many :addresses, as: :addressable
accepts_nested_attributes_for :addresses, reject_if: :all_blank, allow_destroy: true
我的设置控制器有:
def setting_params
params.require(:setting).permit( :newsletter,
addresses_attributes: [:id, :description, :unit, :building, :street_number, :street, :city, :region, :zip, :country, :time_zone, :latitude, :longitude, :_destroy]
)
end
我的路线是:
resources :organisations do
namespace :contacts do
resources :addresses
resources :phones
end
end
resources :users, shallow: true do
scope module: :users do
resources :assign_roles
resources :identities
resources :org_requests
resources :profiles
resources :settings do
namespace :contacts do
resources :addresses
resources :phones
end
end
end
我的地址表有:
我的设置表单有:
<%= simple_form_for [@user, @setting] do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :newsletter, as: :radio_buttons, label: "Subscribe to our newsletter" %>
<%= simple_fields_for :addresses do |f| %>
<%= f.error_notification %>
<%= render 'contacts/addresses/address_fields', f: f %>
<%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>
<% end %>
</div>
<% end %>
错误说:
undefined method `reflect_on_association' for NilClass:Class
此行在错误消息中突出显示:
<%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>
对于其他人来说,问题在于使用单数而不是复数;或使用 @addresses 而不是 :addresses (尽管一些解决方案建议它应该是 @ 而不是 :.
我已经尝试了每种组合中的每一种。
任何人都可以看到我需要做什么来设置它吗?
采纳埃德蒙的建议
我从简单的表单文档中可以看出,嵌套属性在表单中的处理方式应该有所不同。
https://github.com/plataformatec/simple_form/wiki/Nested-Models#example-for-strong-parameters
我尝试将表格更改为:
<%= simple_fields_for "addresses_attributes[]", address do |f| %>
那也不行。我无法呈现要检查的页面。
此上下文中的错误行指出我的组织控制器中的新操作存在问题。那有:
def new
@organisation = Organisation.new
@organisation.addresses_build
end
错误消息说:
undefined method `addresses_build' for #<Organisation:0x007fcf6ff25f08>
Did you mean? addresses
我现在想知道是否需要构建 address_attributes 而不是地址。但是当我尝试时,我收到一条错误消息:
undefined method `addresses_attributes_build' for #<Organisation:0x007fcf72c26d68>
Did you mean? addresses_attributes=
此错误来自 Active Record。这是 Rails 4.2.7 中有关此方法的文档。 Rails 5.
应该不会有太大变化
http://apidock.com/rails/v4.2.7/ActiveRecord/Reflection/ClassMethods/reflect_on_association
Cocoon 正在使用它来识别您的多态模型的所有者 class。您可以通过在控制台中执行以下操作来验证这一点。
Address.reflect_on_association(:addressable)
这会给你多态关联反射
Address.reflect_on_association(:setting)
这个returns没有
而您的 accepts_nested_attributes_for
依靠该方法找到 children/belonging class。请在此处查看源代码。
并且您的表单在设置下嵌套了地址。所以它找不到 parent/owner class.
你必须写
f.simple_fields_for :addresses
f
指的是表单,您需要它才能遍历所有子地址。
其次,最好将link_to_add_association
放在循环之外(否则如果已经有一个地址,你只能添加一个新地址?)
所以写这样的东西
<%= f.simple_fields_for :addresses do |f| %>
<%= render 'contacts/addresses/address_fields', f: f %>
<% end %>
<%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>
(恕我直言,您在简单格式文档中引用的示例已过时,不需要详细的格式)
我正在尝试为我的 Rails 5 应用程序中的嵌套表单设置 cocoon gem。
我遇到了其他人发布的问题,但似乎对他们有用的解决方案对我不起作用。
我有地址、组织和设置的模型。这些协会是:
地址
belongs_to :addressable, :polymorphic => true, optional: true
组织
has_many :addresses, as: :addressable
accepts_nested_attributes_for :addresses, reject_if: :all_blank, allow_destroy: true
设置
has_many :addresses, as: :addressable
accepts_nested_attributes_for :addresses, reject_if: :all_blank, allow_destroy: true
我的设置控制器有:
def setting_params
params.require(:setting).permit( :newsletter,
addresses_attributes: [:id, :description, :unit, :building, :street_number, :street, :city, :region, :zip, :country, :time_zone, :latitude, :longitude, :_destroy]
)
end
我的路线是:
resources :organisations do
namespace :contacts do
resources :addresses
resources :phones
end
end
resources :users, shallow: true do
scope module: :users do
resources :assign_roles
resources :identities
resources :org_requests
resources :profiles
resources :settings do
namespace :contacts do
resources :addresses
resources :phones
end
end
end
我的地址表有:
我的设置表单有:
<%= simple_form_for [@user, @setting] do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :newsletter, as: :radio_buttons, label: "Subscribe to our newsletter" %>
<%= simple_fields_for :addresses do |f| %>
<%= f.error_notification %>
<%= render 'contacts/addresses/address_fields', f: f %>
<%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>
<% end %>
</div>
<% end %>
错误说:
undefined method `reflect_on_association' for NilClass:Class
此行在错误消息中突出显示:
<%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>
对于其他人来说,问题在于使用单数而不是复数;或使用 @addresses 而不是 :addresses (尽管一些解决方案建议它应该是 @ 而不是 :.
我已经尝试了每种组合中的每一种。
任何人都可以看到我需要做什么来设置它吗?
采纳埃德蒙的建议
我从简单的表单文档中可以看出,嵌套属性在表单中的处理方式应该有所不同。
https://github.com/plataformatec/simple_form/wiki/Nested-Models#example-for-strong-parameters
我尝试将表格更改为:
<%= simple_fields_for "addresses_attributes[]", address do |f| %>
那也不行。我无法呈现要检查的页面。
此上下文中的错误行指出我的组织控制器中的新操作存在问题。那有:
def new
@organisation = Organisation.new
@organisation.addresses_build
end
错误消息说:
undefined method `addresses_build' for #<Organisation:0x007fcf6ff25f08>
Did you mean? addresses
我现在想知道是否需要构建 address_attributes 而不是地址。但是当我尝试时,我收到一条错误消息:
undefined method `addresses_attributes_build' for #<Organisation:0x007fcf72c26d68>
Did you mean? addresses_attributes=
此错误来自 Active Record。这是 Rails 4.2.7 中有关此方法的文档。 Rails 5.
应该不会有太大变化http://apidock.com/rails/v4.2.7/ActiveRecord/Reflection/ClassMethods/reflect_on_association
Cocoon 正在使用它来识别您的多态模型的所有者 class。您可以通过在控制台中执行以下操作来验证这一点。
Address.reflect_on_association(:addressable)
这会给你多态关联反射
Address.reflect_on_association(:setting)
这个returns没有
而您的 accepts_nested_attributes_for
依靠该方法找到 children/belonging class。请在此处查看源代码。
并且您的表单在设置下嵌套了地址。所以它找不到 parent/owner class.
你必须写
f.simple_fields_for :addresses
f
指的是表单,您需要它才能遍历所有子地址。
其次,最好将link_to_add_association
放在循环之外(否则如果已经有一个地址,你只能添加一个新地址?)
所以写这样的东西
<%= f.simple_fields_for :addresses do |f| %>
<%= render 'contacts/addresses/address_fields', f: f %>
<% end %>
<%= link_to_add_association 'Manage address', f, :addresses, partial: 'contacts/addresses/address_fields' %>
(恕我直言,您在简单格式文档中引用的示例已过时,不需要详细的格式)