在 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\:\:ArtFairEvent\:\: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 字段。不确定