将枚举与管理集成的正确方法是什么?
What is the proper way to integrate enum with administrate?
我有一个 rails 应用程序,其中用户有性别,这是一个枚举,其中 0 表示女性,1 表示男性。
我在 user_dashboard.rb 中有此代码:
require "administrate/base_dashboard"
class UserDashboard < Administrate::BaseDashboard
ATTRIBUTE_TYPES = {
posts: Field::HasMany,
id: Field::Number.with_options(searchable: false),
email: Field::String.with_options(searchable: true),
password: Field::String.with_options(searchable: false),
password_confirmation: Field::String.with_options(searchable: false),
encrypted_password: Field::String.with_options(searchable: false),
reset_password_token: Field::String.with_options(searchable: false),
reset_password_sent_at: Field::DateTime.with_options(searchable: false),
remember_created_at: Field::DateTime.with_options(searchable: false),
first_name: Field::String.with_options(searchable: false),
last_name: Field::String.with_options(searchable: false),
gender: Field::Text.with_options(searchable: false),
type: Field::String.with_options(searchable: false),
created_at: Field::DateTime.with_options(searchable: false),
updated_at: Field::DateTime.with_options(searchable: false),
phone: Field::String.with_options(searchable: false),
}.freeze
COLLECTION_ATTRIBUTES = %i[
posts
email
phone
type
].freeze
SHOW_PAGE_ATTRIBUTES = %i[
posts
id
email
phone
first_name
last_name
gender
type
created_at
updated_at
].freeze
FORM_ATTRIBUTES = %i[
posts
email
phone
first_name
last_name
gender
password
password_confirmation
type
].freeze
COLLECTION_FILTERS = {}.freeze
end
new_admin_user_path
的观点是:
只有管理员可以创建用户,但他们必须手动输入性别,例如“男”或“女”。有没有办法集成一个 select 菜单或单选按钮来管理 gem?
一种选择是在您的 ATTRIBUTE_TYPES:
中执行此操作
ATTRIBUTE_TYPES = {
...
gender: Field::Select.with_options(collection: ["female", "male"]),
}
您也可以尝试 AdminstrateFieldEnum gem。
https://github.com/valiot/administrate-field-enum
假设 gender
是您的 app/person.rb 模型的枚举字段:
class Person < ApplicationRecord
enum gender: { female: 0, male: 1 }
# . . .
end
您的 20200922125209_create_persons.rb 迁移的位置:
class CreatePersons < ActiveRecord::Migration[6.0]
def change
create_table :persons do |t|
t.integer :gender
# . . .
在您的 app/dashboards/person_dashboard.rb 中添加以下内容:
ATTRIBUTE_TYPES = {
# . . .
gender: Field::Select.with_options(searchable: false, collection: ->(field) { field.resource.class.send(field.attribute.to_s.pluralize).keys }),
# . . .
}
然后,只需将 gender
字段添加到您的 COLLECTION_ATTRIBUTES、SHOW_PAGE_ATTRIBUTES 数组。
Adminstrate 的魔力将处理其余部分,在显示和索引视图中显示“女性”或“男性”,并在编辑表单中显示 select 下拉列表。
我有一个 rails 应用程序,其中用户有性别,这是一个枚举,其中 0 表示女性,1 表示男性。
我在 user_dashboard.rb 中有此代码:
require "administrate/base_dashboard"
class UserDashboard < Administrate::BaseDashboard
ATTRIBUTE_TYPES = {
posts: Field::HasMany,
id: Field::Number.with_options(searchable: false),
email: Field::String.with_options(searchable: true),
password: Field::String.with_options(searchable: false),
password_confirmation: Field::String.with_options(searchable: false),
encrypted_password: Field::String.with_options(searchable: false),
reset_password_token: Field::String.with_options(searchable: false),
reset_password_sent_at: Field::DateTime.with_options(searchable: false),
remember_created_at: Field::DateTime.with_options(searchable: false),
first_name: Field::String.with_options(searchable: false),
last_name: Field::String.with_options(searchable: false),
gender: Field::Text.with_options(searchable: false),
type: Field::String.with_options(searchable: false),
created_at: Field::DateTime.with_options(searchable: false),
updated_at: Field::DateTime.with_options(searchable: false),
phone: Field::String.with_options(searchable: false),
}.freeze
COLLECTION_ATTRIBUTES = %i[
posts
email
phone
type
].freeze
SHOW_PAGE_ATTRIBUTES = %i[
posts
id
email
phone
first_name
last_name
gender
type
created_at
updated_at
].freeze
FORM_ATTRIBUTES = %i[
posts
email
phone
first_name
last_name
gender
password
password_confirmation
type
].freeze
COLLECTION_FILTERS = {}.freeze
end
new_admin_user_path
的观点是:
只有管理员可以创建用户,但他们必须手动输入性别,例如“男”或“女”。有没有办法集成一个 select 菜单或单选按钮来管理 gem?
一种选择是在您的 ATTRIBUTE_TYPES:
中执行此操作ATTRIBUTE_TYPES = {
...
gender: Field::Select.with_options(collection: ["female", "male"]),
}
您也可以尝试 AdminstrateFieldEnum gem。 https://github.com/valiot/administrate-field-enum
假设 gender
是您的 app/person.rb 模型的枚举字段:
class Person < ApplicationRecord
enum gender: { female: 0, male: 1 }
# . . .
end
您的 20200922125209_create_persons.rb 迁移的位置:
class CreatePersons < ActiveRecord::Migration[6.0]
def change
create_table :persons do |t|
t.integer :gender
# . . .
在您的 app/dashboards/person_dashboard.rb 中添加以下内容:
ATTRIBUTE_TYPES = {
# . . .
gender: Field::Select.with_options(searchable: false, collection: ->(field) { field.resource.class.send(field.attribute.to_s.pluralize).keys }),
# . . .
}
然后,只需将 gender
字段添加到您的 COLLECTION_ATTRIBUTES、SHOW_PAGE_ATTRIBUTES 数组。
Adminstrate 的魔力将处理其余部分,在显示和索引视图中显示“女性”或“男性”,并在编辑表单中显示 select 下拉列表。