首页 > 解决方案 > 在 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 获取。

例如,当我尝试选择一个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 管理员使用该字段。

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>

When either option with a value Event::is selected, Sizzle complains, throwing a syntax error.

在我的代码检查器中,如果我转义冒号,则使值Event\:\:ArtFairEvent\:\:Exhibition事物按预期工作。

标签: ruby-on-railsrails-admin

解决方案


我明白了,那些不是有效的 js 标识符。如果您通过添加 _enum 实例方法来定义选择的内容,我认为您可以对这些值进行转义。

首先,您需要获取模型的可能内容列表。

我在这里从臀部拍摄,但应该是这样的:

  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 字段。没有把握


推荐阅读