在Rails Admin中使用带有多态关联的命名空间模型

问题描述 投票:1回答:1

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

ruby-on-rails rails-admin
1个回答
0
投票

我知道,这些不是有效的js标识符。我认为,如果通过添加_enum实例方法定义了select的内容,则可以对值进行转换。

© www.soinside.com 2019 - 2024. All rights reserved.