首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个区域中显示Administrate属性,而在另一个区域中不显示

在一个区域中显示Administrate属性,而在另一个区域中不显示
EN

Stack Overflow用户
提问于 2021-04-16 17:40:46
回答 2查看 769关注 0票数 3

我正在创建一个学习管理系统。我已经让用户注册了课程。我想在“用户显示”页面上显示用户何时完成了课程。如下所示:

如果我将complete属性添加到app/dashboards/course_dashboard.rb中的COLLECTION_ATTRIBUTES下,它也会显示在课程索引页面中,我不想这样做:

如何将此complete属性添加到用户显示页面(如第一个图像)上的用户的课程信息中,而不将其添加到课程索引页(如第二个图像)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-17 17:02:20

不幸的是,行政部门并不支持这一点。不过,只要使用一点Ruby技巧,这是可能的。这是非官方的,确切的实现可能会随着新版本的Administrate而改变。它应该适用于Administrate0.15,可能还有其他版本。

关键是管理员代码中的这个模板:https://github.com/thoughtbot/administrate/blob/c16b8d1ee3a5ef1d622f9470738e89d73dbb8f1b/app/views/administrate/application/_collection.html.erb

这里有两条线很重要。第一个列表列出了表头<th>,它是这样的:

代码语言:javascript
复制
<% collection_presenter.attribute_types.each do |attr_name, attr_type| %>

第二个列列出了每个记录的数据列<td>,如下所示:

代码语言:javascript
复制
<% collection_presenter.attributes_for(resource).each do |attribute| %>

链接指向Administrate用于呈现集合的模板。这可以是索引页,也可以是HasMany字段中的记录列表。在上面的每一行中,它迭代为仪表板定义的集合属性,这取决于情况,由collection_presenter.attribute_typescollection_presenter.attributes_for(...)返回。

为了达到您想要的效果,在呈现索引页或呈现HasMany列表时,需要这些列表有所不同。目前,HasMany字段没有一个选项可以规定在它们的情况下,这个列表必须有任何不同。

幸运的是我们可以在这里一起破解一些东西。

首先,从:complete中删除CourseDashboard::COLLECTION_ATTRIBUTES。您不希望它列在索引页中,所以它不应该出现在那里。不需要CourseDashboard::ATTRIBUTE_TYPES中删除它,因为我们仍然需要定义它,以便我们可以在其他地方使用它。

第二,创建一个新字段。我打算叫它CustomHasMany,但它可能是任何东西:

代码语言:javascript
复制
$ ./bin/rails g administrate:field custom_has_many
      create  app/fields/custom_has_many_field.rb
      create  app/views/fields/custom_has_many_field/_show.html.erb
      create  app/views/fields/custom_has_many_field/_index.html.erb
      create  app/views/fields/custom_has_many_field/_form.html.erb

我们将在courses中使用这个字段作为UserDashboard属性

代码语言:javascript
复制
require "administrate/base_dashboard"

class UserDashboard < Administrate::BaseDashboard
  ATTRIBUTE_TYPES = {
    # ...
    courses: CustomHasManyField
    # ...
  }

这在一开始是行不通的,因为这个领域是新的。它需要的第一件事是复制现有HasMany字段的行为。我们可以通过类继承来做到这一点:

代码语言:javascript
复制
class CustomHasManyField < Administrate::Field::HasMany
end

这不太像HasMany字段,因为它使用生成器提供的基本模板。让我们告诉它使用has_many模板:

代码语言:javascript
复制
class CustomHasManyField < Administrate::Field::HasMany
  def to_partial_path
    "/fields/has_many/#{page}"
  end
end

好的,现在它应该与HasMany字段相同。到目前为止,它一直在使用公共接口和“官方”管理人员。我不得不承认,to_partial_path并没有很好的文档,但我认为它足够稳定。

所以现在我们必须告诉它将complete添加到字段列表中.这就是黑客入侵的原因。

如果您阅读了Administrate的源代码,您会发现上面的collection_presenter是由高级模板提供的。反过来,这被定义为field.associated_collection(order),其中field是字段对象,在我们的例子中,它是CustomHasManyField的一个实例。

因此,如果我们可以黑客CustomHasManyField#associated_collection返回一个集合,其attribute_typesattributes_for包括:complete.我们应该没事吧?

查看集合的代码,我们可以看到,这两个列表依次基于另一个方法attribute_names的结果,这是应该呈现哪些属性的真相来源:https://github.com/thoughtbot/administrate/blob/c16b8d1ee3a5ef1d622f9470738e89d73dbb8f1b/lib/administrate/page/collection.rb --如果我们修改这个attribute_names方法,其余的也应该跟着做。

猴子扑救:

代码语言:javascript
复制
class CustomHasManyField < Administrate::Field::HasMany
  def associated_collection(*)
    collection = super

    def collection.attribute_names
      [:complete] + super
    end

    collection
  end

  def to_partial_path
    "/fields/has_many/#{page}"
  end
end

好像在我的电脑里能用。对你有用吗?

至于以更正式的方式来做这件事..。你想为这个项目建立一个公共关系吗?

票数 5
EN

Stack Overflow用户

发布于 2021-04-16 23:42:17

查看https://administrate-demo.herokuapp.com/customizing_dashboards中的文档

您需要在SHOW_PAGE_ATTRIBUTES中添加属性。不是在COLLECTION_ATTRIBUTES。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67129863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档