ruby-on-rails - 在 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\:\:ArtFair
和Event\:\:Exhibition
事物按预期工作。
解决方案
我明白了,那些不是有效的 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 字段。没有把握
推荐阅读
- websocket - 如何转换 Vec
进入 bson::document::Document? - java - 在过滤器 findAny 之前,地图是否应用于所有列表?
- java - for循环中的布尔返回语句和if语句在java中总是返回false
- python - 在列表中添加数字对
- python - 在 Python 中,我如何反编译用 compile() 函数编译的东西?
- python - 在 Python 字典中选择所有具有最大值和最小值的键
- terraform - Terraform 相对路径
- javascript - 如何使用`Mocha`,`Chai`,`Sinon`检查一个函数是否触发另一个函数
- ggplot2 - 在绘图网格中按列绘制 ggplots - cowplot 包的 plot_grid() 函数
- c# - .net core web api 应用程序在本地运行时不起作用 - 无法验证第一个证书