我知道,这些不是有效的js标识符。我认为,如果通过添加_enum实例方法定义了select的内容,则可以对值进行转换。
在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提取。
例如,当我尝试选择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
当我选择
Post
时,所有帖子均按预期返回。
这是一个错误,还是我应该可以使用其他设置解决此问题?我唯一需要的配置就是告诉Rails Admin使用该字段。
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::
的选项时,Sizzle抱怨,并引发语法错误。
在我的代码检查器中,如果我转义了冒号,使值Event\:\:ArtFair
和Event\:\:Exhibition
正常工作。
[在RailsAdmin中,我试图通过两个类来管理我的多态Region,一个是命名空间,另一个不是。类Region
我知道,这些不是有效的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字段定义为枚举,甚至将contentable_type字段定义为。不确定
我知道,这些不是有效的js标识符。我认为,如果通过添加_enum实例方法定义了select的内容,则可以对值进行转换。