在 Rails Admin 中使用具有多态关联的命名空间模型
Using namespaced models with polymorphic assocations in Rails Admin
在 RailsAdmin 中,我试图用两个 类 来管理我的多态 Region
,一个有命名空间,一个没有命名空间。
class Region < ApplicationRecord
belongs_to :contentable, polymorphic: true
end
class Event::Exhibition < ApplicationRecord
has_many :regions, as: :contentable
end
class Post < ApplicationRecord
has_many :regions, as: :contentable
end
除 ajax 获取命名空间模型的实例外,一切正常。
例如,当我尝试 select 一个 Event::Exhibition
时,我在浏览器的控制台中看到了这个。
Error: Syntax error, unrecognized expression: #event::exhibition-js-options rails_admin.js:1502:8
error http://localhost:3000/assets/rails_admin/rails_admin.js:1502
当我 select Post
我的所有帖子都按预期返回时。
这是一个错误还是我应该能够通过不同的设置来解决这个问题?我唯一的配置是告诉 Rails 管理员使用该字段。
edit do
field :contentable
end
深入研究 HTML 和 JavaScript(感谢@Guillermo),我注意到生成的下拉菜单看起来像这样。
<option value=""></option>
<option value="Event::ArtFair">Art fair</option>
<option value="Event::Exhibition">Exhibition</option>
<option selected="selected" value="Post">News article</option>
当 Event::
值的任一选项被 selected 时,Sizzle 抱怨,抛出语法错误。
在我的代码检查器中,如果我对冒号进行转义,则值 Event\:\:ArtFair
和 Event\:\:Exhibition
会按预期工作。
我明白了,这些不是有效的 js 标识符。如果您通过添加 _enum 实例方法定义了 select 的内容,我认为您可以转义这些值。
首先您需要获取模型的可能内容列表。
我在这里从臀部拍摄,但它应该是这样的:
def self.contentable_models
ActiveRecord::Base.descendants.select do |model|
model.reflect_on_all_associations(:has_many).any? do |has_many_association|
has_many_association.options[:as] == :contentable
end
end
end
def contentable_enum
self.class.contentable_models.map |model|
[
model.name.humanize,
model.class.name.gsub(':','\:')
]
end
end
我不确定 contentable_models
的性能,如果您有许多模型,它会迭代所有模型以找到您可能想要记住该值的内容。
您可能需要将内容字段定义为枚举甚至 contentable_type 字段。不确定
在 RailsAdmin 中,我试图用两个 类 来管理我的多态 Region
,一个有命名空间,一个没有命名空间。
class Region < ApplicationRecord
belongs_to :contentable, polymorphic: true
end
class Event::Exhibition < ApplicationRecord
has_many :regions, as: :contentable
end
class Post < ApplicationRecord
has_many :regions, as: :contentable
end
除 ajax 获取命名空间模型的实例外,一切正常。
例如,当我尝试 select 一个 Event::Exhibition
时,我在浏览器的控制台中看到了这个。
Error: Syntax error, unrecognized expression: #event::exhibition-js-options rails_admin.js:1502:8
error http://localhost:3000/assets/rails_admin/rails_admin.js:1502
当我 select Post
我的所有帖子都按预期返回时。
这是一个错误还是我应该能够通过不同的设置来解决这个问题?我唯一的配置是告诉 Rails 管理员使用该字段。
edit do
field :contentable
end
深入研究 HTML 和 JavaScript(感谢@Guillermo),我注意到生成的下拉菜单看起来像这样。
<option value=""></option>
<option value="Event::ArtFair">Art fair</option>
<option value="Event::Exhibition">Exhibition</option>
<option selected="selected" value="Post">News article</option>
当 Event::
值的任一选项被 selected 时,Sizzle 抱怨,抛出语法错误。
在我的代码检查器中,如果我对冒号进行转义,则值 Event\:\:ArtFair
和 Event\:\:Exhibition
会按预期工作。
我明白了,这些不是有效的 js 标识符。如果您通过添加 _enum 实例方法定义了 select 的内容,我认为您可以转义这些值。
首先您需要获取模型的可能内容列表。
我在这里从臀部拍摄,但它应该是这样的:
def self.contentable_models
ActiveRecord::Base.descendants.select do |model|
model.reflect_on_all_associations(:has_many).any? do |has_many_association|
has_many_association.options[:as] == :contentable
end
end
end
def contentable_enum
self.class.contentable_models.map |model|
[
model.name.humanize,
model.class.name.gsub(':','\:')
]
end
end
我不确定 contentable_models
的性能,如果您有许多模型,它会迭代所有模型以找到您可能想要记住该值的内容。
您可能需要将内容字段定义为枚举甚至 contentable_type 字段。不确定