ruby-on-rails - 如何在管理 gem 中关联 Ancestry gem 数据
问题描述
我在我的 Rails 6 应用程序中使用了 Administrate gem。我已经创建了一个类别模型,并且正在使用祖先 gem 来组织树结构等。我在尝试将祖先 gem 集成到管理中时遇到了麻烦。主要是祖先 gem 的 parent_id 为 null 的问题,因此 2. 尝试在管理中显示子名称/关系。
- 由于关系,当编辑表单时,Administrate gem 将不接受空值,将“祖先”添加到管理中的仪表板表单中。
- 我试图克服的另一个问题是显示祖先使用的 id 的关联名称。因此,祖先使用一个字符串字段,该字段有助于使用类别行的 id 定位父级。我不知道如何操作管理仪表板/控制器来显示字段名称。
任何帮助将不胜感激。我已经用谷歌搜索了这个,似乎找不到与同一问题相关的任何内容。
是否值得同时使用祖先和管理?还是我应该创建自己的类别控制器和视图以允许管理员修改类别数据?如果可能,我更愿意尝试将所有管理内容保留在 Administrate 中。
谢谢一米。
解决方案
只需在下面添加我的解决方案,以防其他人遇到问题。
允许 Administrate 接受 null 值,即使由于模型中关系的祖先 gem 使用可能需要存在。例如。
class Category < ApplicationRecord
has_ancestry
end
您可以在管理中覆盖管理控制器中的“资源参数”。
# Override `resource_params` if you want to transform the submitted
# data before it's persisted. For example, the following would turn all
# empty values into nil values. It uses other APIs such as `resource_class`
# and `dashboard`:
def resource_params
params.require(resource_class.model_name.param_key).
permit(dashboard.permitted_attributes).
transform_values { |value| value == "" ? nil : value }
end
第2部分。
在仪表板类别中,我想将 ID 更改为描述性名称。Ancestry gem 使用字符串字段来显示父类别的 ID。
仪表板 > category_dashboard.rb 文件
ATTRIBUTE_TYPES = {
ancestry: Field::Select.with_options(collection: Category.all.map do |cat| [cat.name, cat.id] end),
#ancestry: Field::Text,
}.freeze
我已将 attriubte_type 设置为带有选项值而不是文本字段的选择,并映射了名称和 ID。
这使我可以选择父类别的 ID,查看其名称而不是 ID。但是,我无法选择 Null 值,如果我希望第 1 部分执行其操作并设置空白字段 = null,我需要将此选择区域留空。由管理员用户添加时使类别成为父类别。
您可以使用生成命令在管理中生成所有字段。(一旦有机会,我会将其添加到评论中)。
添加后,我可以编辑选择字段表单。这允许我将 :include_blank => 'Primary Category' 添加到 adminstrate 中的选择字段表单中。
<% if field.selectable_options.first&.is_a?(Array) %>
<%= f.select(
field.attribute,
options_from_collection_for_select(
field.selectable_options,
:last,
:first,
field.data.presence,
),
:include_blank => 'Primary Category'
) %>
<% else %>
<%= f.select(
field.attribute,
options_from_collection_for_select(
field.selectable_options,
:to_s,
:to_s,
field.data.presence,
),
:include_blank => 'Primary Category'
) %>
<% end %>
推荐阅读
- spring - SSM 框架中的事务回滚问题
- machine-learning - AutoML NL - 基于 ICD10-CM 的训练模型 - 所需文本量
- c++ - C ++:当我更改数组中的最大元素数时,合并排序停止工作?
- python - 运行 python 脚本时列表索引超出范围
- android - 在对话框片段上保存用户输入后无法更新父列表
- python - 程序集和python之间的转移
- git - 如何将 master 回滚到先前的提交,进行更改,然后重新应用回滚的所有内容?
- android - 从 Playstore 下载时 APK 崩溃 - 调试工作正常
- apache-kafka - 用于python和java配置的kafka ssl
- javascript - 尝试自定义平面图 es2017 Javascript 时遗留的数组