在一个区域显示管理属性但在另一个区域不显示
Show Administrate Attribute in One Area But Not In Another
我正在创建一个学习管理系统。我已经让用户注册了课程。我想在用户显示页面上显示用户完成课程的时间。像这样:
如果我在 COLLECTION_ATTRIBUTES
下的 app/dashboards/course_dashboard.rb
中添加 complete
属性,它也会显示在课程索引页面中,这是我不想要的:
如何将此 complete
属性添加到用户显示页面上的用户课程信息(如第一张图片)而不是将其添加到课程索引页面(如第二张图片)?
查看 https://administrate-demo.herokuapp.com/customizing_dashboards
中的文档
您需要在SHOW_PAGE_ATTRIBUTES中添加属性。不在 COLLECTION_ATTRIBUTES.
遗憾的是,Adminstrate 不支持开箱即用。然而,使用一些 Ruby 技巧是可能的。这是非官方的,确切的实施可能会随着新版本的管理而改变。它应该适用于 Administrate 0.15,可能还有其他版本。
这里有两行很重要。第一个列出了table headers <th>
,就是这个:
<% collection_presenter.attribute_types.each do |attr_name, attr_type| %>
第二个列出每条记录的数据列<td>
,它看起来像这样:
<% collection_presenter.attributes_for(resource).each do |attribute| %>
link 是 Administrate 用来呈现 collection 的模板。这可以是索引页,或 HasMany 字段中的记录列表。在上面的每一行中,它遍历为仪表板定义的 collection 属性,由 collection_presenter.attribute_types
和 collection_presenter.attributes_for(...)
编辑 return,视情况而定。
为了达到您想要的效果,您需要在呈现索引页面或呈现 HasMany 列表时使这些列表不同。目前没有 HasMany 字段的选项来指示此列表在它们的情况下必须有任何不同。
幸运的是我们可以在这里一起破解一些东西。
首先,从 CourseDashboard::COLLECTION_ATTRIBUTES
中删除 :complete
。您不希望它列在索引页中,所以它不应该出现在那里。 不要从CourseDashboard::ATTRIBUTE_TYPES
中删除它,因为我们仍然需要定义它以便我们可以在其他地方使用它。
其次,新建一个字段。我打算将其命名为 CustomHasMany
,但它可以是任何名称:
$ ./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
我们将在 UserDashboard
:
中将此字段用于您的 courses
属性
require "administrate/base_dashboard"
class UserDashboard < Administrate::BaseDashboard
ATTRIBUTE_TYPES = {
# ...
courses: CustomHasManyField
# ...
}
这最初不会起作用,因为该字段是新字段。它需要做的第一件事是复制现有 HasMany
字段的行为。我们可以通过 class 继承来做到这一点:
class CustomHasManyField < Administrate::Field::HasMany
end
这不会完全模仿 HasMany
字段,因为它使用生成器提供的基本模板。让我们告诉它改用 has_many
模板:
class CustomHasManyField < Administrate::Field::HasMany
def to_partial_path
"/fields/has_many/#{page}"
end
end
好的,现在它应该与 HasMany
字段相同。到目前为止,这一直在使用 public 界面和“官方”管理内容。我不得不承认 to_partial_path
没有很好的记录,但我认为它是 stable 就足够了。
所以现在我们必须告诉它添加 complete
到字段列表...这就是 hack 发挥作用的地方。
如果你读过Adminstrate的源代码,你会发现上面的collection_presenter
是由upper-level模板提供的。反过来,这被定义为 field.associated_collection(order)
,其中 field
是字段 object,在我们的例子中是 CustomHasManyField
.
的实例
因此,如果我们可以将 CustomHasManyField#associated_collection
破解为 return 一个 collection,其 attribute_types
和 attributes_for
包含 :complete
... 我们应该没事吧?
查看 collections 的代码,我们可以看到这两个列表依次基于另一种方法 attribute_names
的结果,这是关于哪些属性应该被渲染:https://github.com/thoughtbot/administrate/blob/c16b8d1ee3a5ef1d622f9470738e89d73dbb8f1b/lib/administrate/page/collection.rb如果我们修改这个attribute_names
方法,其余的应该照做。
Monkeypatching 拯救:
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
这看起来在我的电脑上有效。它对你有用吗?
至于以更正式的方式来做这件事……你想为这个项目创建一个 PR 吗?
我正在创建一个学习管理系统。我已经让用户注册了课程。我想在用户显示页面上显示用户完成课程的时间。像这样:
如果我在 COLLECTION_ATTRIBUTES
下的 app/dashboards/course_dashboard.rb
中添加 complete
属性,它也会显示在课程索引页面中,这是我不想要的:
如何将此 complete
属性添加到用户显示页面上的用户课程信息(如第一张图片)而不是将其添加到课程索引页面(如第二张图片)?
查看 https://administrate-demo.herokuapp.com/customizing_dashboards
中的文档您需要在SHOW_PAGE_ATTRIBUTES中添加属性。不在 COLLECTION_ATTRIBUTES.
遗憾的是,Adminstrate 不支持开箱即用。然而,使用一些 Ruby 技巧是可能的。这是非官方的,确切的实施可能会随着新版本的管理而改变。它应该适用于 Administrate 0.15,可能还有其他版本。
这里有两行很重要。第一个列出了table headers <th>
,就是这个:
<% collection_presenter.attribute_types.each do |attr_name, attr_type| %>
第二个列出每条记录的数据列<td>
,它看起来像这样:
<% collection_presenter.attributes_for(resource).each do |attribute| %>
link 是 Administrate 用来呈现 collection 的模板。这可以是索引页,或 HasMany 字段中的记录列表。在上面的每一行中,它遍历为仪表板定义的 collection 属性,由 collection_presenter.attribute_types
和 collection_presenter.attributes_for(...)
编辑 return,视情况而定。
为了达到您想要的效果,您需要在呈现索引页面或呈现 HasMany 列表时使这些列表不同。目前没有 HasMany 字段的选项来指示此列表在它们的情况下必须有任何不同。
幸运的是我们可以在这里一起破解一些东西。
首先,从 CourseDashboard::COLLECTION_ATTRIBUTES
中删除 :complete
。您不希望它列在索引页中,所以它不应该出现在那里。 不要从CourseDashboard::ATTRIBUTE_TYPES
中删除它,因为我们仍然需要定义它以便我们可以在其他地方使用它。
其次,新建一个字段。我打算将其命名为 CustomHasMany
,但它可以是任何名称:
$ ./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
我们将在 UserDashboard
:
courses
属性
require "administrate/base_dashboard"
class UserDashboard < Administrate::BaseDashboard
ATTRIBUTE_TYPES = {
# ...
courses: CustomHasManyField
# ...
}
这最初不会起作用,因为该字段是新字段。它需要做的第一件事是复制现有 HasMany
字段的行为。我们可以通过 class 继承来做到这一点:
class CustomHasManyField < Administrate::Field::HasMany
end
这不会完全模仿 HasMany
字段,因为它使用生成器提供的基本模板。让我们告诉它改用 has_many
模板:
class CustomHasManyField < Administrate::Field::HasMany
def to_partial_path
"/fields/has_many/#{page}"
end
end
好的,现在它应该与 HasMany
字段相同。到目前为止,这一直在使用 public 界面和“官方”管理内容。我不得不承认 to_partial_path
没有很好的记录,但我认为它是 stable 就足够了。
所以现在我们必须告诉它添加 complete
到字段列表...这就是 hack 发挥作用的地方。
如果你读过Adminstrate的源代码,你会发现上面的collection_presenter
是由upper-level模板提供的。反过来,这被定义为 field.associated_collection(order)
,其中 field
是字段 object,在我们的例子中是 CustomHasManyField
.
因此,如果我们可以将 CustomHasManyField#associated_collection
破解为 return 一个 collection,其 attribute_types
和 attributes_for
包含 :complete
... 我们应该没事吧?
查看 collections 的代码,我们可以看到这两个列表依次基于另一种方法 attribute_names
的结果,这是关于哪些属性应该被渲染:https://github.com/thoughtbot/administrate/blob/c16b8d1ee3a5ef1d622f9470738e89d73dbb8f1b/lib/administrate/page/collection.rb如果我们修改这个attribute_names
方法,其余的应该照做。
Monkeypatching 拯救:
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
这看起来在我的电脑上有效。它对你有用吗?
至于以更正式的方式来做这件事……你想为这个项目创建一个 PR 吗?