【问题标题】:How do I relate Ancestry gem data in Administrate gem如何在管理 gem 中关联 Ancestry gem 数据
【发布时间】:2020-08-24 11:24:28
【问题描述】:

我在我的 Rails 6 应用程序中使用了 Administrate gem。我已经创建了一个类别模型,并且正在使用祖先 gem 来组织树结构等。我在尝试将祖先 gem 集成到管理中时遇到了麻烦。主要是祖先 gem 的 parent_id 为 null 的问题,因此 2. 尝试在 Administrate 中显示子名称/关系。

  1. 在管理中将“祖先”表单添加到仪表板表单中时,管理 gem 将不接受空值。
  2. 我试图克服的另一个问题是显示祖先使用的 id 的关联名称。因此,祖先使用一个字符串字段,该字段有助于使用类别行的 id 定位父级。我不知道如何操作管理仪表板/控制器来显示字段名称。

任何帮助将不胜感激。我用谷歌搜索了这个问题,似乎找不到与同一问题相关的任何内容。

值得同时使用 Ancestry 和 Administrate 吗?还是我应该创建自己的类别控制器和视图以允许管理员修改类别数据?如果可能,我更愿意尝试将所有管理内容保留在 Administrate 中。

谢谢。

【问题讨论】:

  • 我现在正在调查这个。我不确定我是否 100% 了解所有内容。例如,当你说“is null so and 2”时,我想你可能错过了什么?另一个类似的部分是“祖先使用的 id 的孩子”。
  • 此外,您在仪表板中定义了哪些与祖先相关的字段?您使用什么字段类型?您能否分享显示您拥有的代码摘录?
  • 既然我们在这里:你能分享一个你想要的例子吗?所需最终状态的草图将非常有助于可视化您想要实现的目标。
  • 嗨@pablobm,感谢您花时间阅读我的问题。为迟到的回复道歉。我目前每周工作 2 天,所以当我有时间时,我会跳进跳出。让我看看我的问题(拼写等),稍后再详细说明这个问题。再次感谢您的宝贵时间。

标签: ruby-on-rails ancestry administrate


【解决方案1】:

只需在下面添加我的解决方案,以防其他人遇到问题。

允许 Administrate 接受空值,即使由于模型中关系的祖先 gem 使用而可能需要存在。例如。

class Category < ApplicationRecord
  has_ancestry
end

您可以在 Administrate 中覆盖 Admin 控制器中的“资源参数”。

# 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,我需要将此选择区域留空。由管理员用户添加时将类别设为父类别。

您可以使用生成命令生成管理中的所有字段。 (一旦有机会,我会将其添加到 cmets 中)。

添加后,我可以编辑选择字段表单。这让我可以将 :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 %>

【讨论】:

  • rails generate administrate:views:field all
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多