我在Rails6应用程序中使用Administrategem。我已经创建了一个类别模型,我正在使用祖先宝石来组织树结构等。我在尝试将祖先宝石集成到Administrate中时遇到了困难。主要是一个问题,其中祖先gem的parent_id为空so和2。尝试在Administrate中显示子名称/关系。
- 由于关系,Administrate gem在编辑表单时不会接受空值;祖先;已添加到administrator中的仪表板窗体中
- 我试图克服的另一个问题是显示孩子的相关名称,即祖先使用的id。因此,祖先使用字符串字段,这有助于使用类别行的id定位父级。我不知道如何操作Administrate面板/控制器来显示字段名称
如有任何帮助,我们将不胜感激。我在谷歌上搜索了一段时间,似乎找不到任何与同一问题有关的东西。
Ancestry和Administrate一起使用值得吗?或者我应该创建自己的类别控制器和视图,以允许管理员修改类别数据吗?如果可能的话,我更愿意尝试将所有的管理内容保留在Administrate中。
非常感谢。
只需在下面添加我的解决方案,以防其他人遇到这个问题。
允许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部分。
在Dashboard类别中,我想将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设置为select,并映射了名称和id。
这让我可以选择父类别的ID,看到他们的名字而不是ID。然而,我不能选择Null值,如果我想让第1部分完成它的工作并使空白字段为Null,我需要将此选择区域留空。当管理员用户添加时,使类别成为父类别。
您可以使用generate命令在Administrate中生成所有字段。(一旦有机会,我会把这个添加到评论中(。
添加后,我可以编辑"选择"字段表单。这允许我添加:include_blank=>'"主类别"添加到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 %>