如何在管理仪表板的编辑视图中显示多个复选框字段?
How do you display multiple checkbox fields in the edit view of the Administrate dashboard?
我在用户模型上的一个字段中有多个复选框。复选框选择当前存储为数组。我正在尝试为用户在管理仪表板的编辑视图中重新创建多个复选框,但不确定如何(文档中的选项似乎没有涵盖这一点)。
这里是引入字段的迁移:
class AddEmploymentTypesToUser < ActiveRecord::Migration[6.0]
def change
add_column :users, :employment_types, :text, array:true, default: []
end
end
我想在仪表板编辑视图中重新创建的用户表单中的 UI:
该表格的代码:
<div class="form-group">
<label class="font-weight-bold" for="">What type of employment are you looking for?</label>
<br>
<%= f.check_box :employment_types, { :multiple => true }, 'Full-time', nil%> Full-time
<br>
<%= f.check_box :employment_types, { :multiple => true }, 'Part-time', nil%> Part-time
<br>
<%= f.check_box :employment_types, { :multiple => true }, 'Freelance', nil%> Freelance
<br>
<%= f.check_box :employment_types, { :multiple => true }, 'Contract-to-hire', nil%> Contract-to-hire
</div>
check_box_tag
就是您要找的。阅读更多 here
<div class="form-group">
<label class="font-weight-bold" for="">What type of employment are you looking for?</label>
<% ['Full-time', 'Part-time', 'Freelance', 'Contract-to-hire'].each do |type| %>
<%= check_box_tag "put_your_form_model_here[employment_types][]", type, uniq_number_that_you_want_for_each_type %>
<% end %>
</div>
您必须为此提供自定义字段类型,因为 Administrate 提供的字段类型在这里并不适用。我很确定这样做的原因是这种字段可以通过多种方式实现,因此 Adminstrate 无法提供单一、统一的解决方案。
要创建新字段,继承自 Administrate::Field::Base
:
### app/fields/checkbox_list.rb
class CheckboxList < Administrate::Field::Base
def self.permitted_attribute(attr, _options = nil)
# Yes, this has to be a hash rocket `=>`,
# not a colon `:`. Otherwise it will be the key
# `attr` (literally) as opposed to a key whose name
# is the value of the argument `attr`.
{ attr => [] }
end
def choices
options[:choices]
end
end
针对您的具体情况,我正在实施两种方法。我会一一解释。
首先是self.permitted_attribute
。这是一个 API,Administrate 内部使用它来弄清楚如何将您的新字段类型转换为 params.require(...).permit(...)
.
的术语
因为您的字段被建模为复选框列表,params
会将其视为一个数组:
params[:user]
# => { name: "Conway Anderson", employment_types: ["Freelance", "Contract-to-hire"] }
告诉 permit
接受这个,通常你在 Rails 应用程序中这样做:
params.require(:user).permit(:name, employment_types: [])
通过像我上面那样实现 CheckboxList.permitted_attributes
,Adminstrate 传递正确的信息 (employment_types: []
) 以允许:它表示允许 employment_types
,这将是一个数组值。您可能已经在其他地方的应用程序中这样做了?
这是第一种方法!现在是第二个:choices
。这是从 options
读取的,它是提供给仪表板定义中的字段的选项列表。例如这里:
ATTRIBUTE_TYPES = {
id: Field::Number,
name: Field::String,
# ...
employment_types: CheckboxList.with_options(choices: ['Full-time', 'Part-time', 'Freelance', 'Contract-to-hire']),
}.freeze
这样,CheckboxList
可以重复用于不同的选择列表。请注意,我没有使用 options
这个词,因为 Administrate::Field::Base
已经在内部使用了它,这会产生冲突。
继续,您的字段还需要模板部分,以告诉 Rails 如何呈现它。这些放在 views/
文件夹中,例如可以这样查找:
### app/views/fields/checkbox_list/_index.html.erb
<%= field.data.join(', ') %>
### app/views/fields/checkbox_list/_show.html.erb
<%= field.data.join(', ') %>
### app/views/fields/checkbox_list/_form.html.erb
<div class="field-unit__label">
<%= f.label field.attribute %>
</div>
<div class="field-unit__field">
<%= f.collection_check_boxes field.attribute, field.choices, :itself, :itself %>
</div>
最棘手的是表格。请注意,我使用 field.choices
,它与 class CheckboxList
中定义的方法 choices
相同,并且从仪表板中给出的选项中读取。
我想就是这样!将新字段和类型添加到您的仪表板(不要忘记将其添加到 SHOW_PAGE_ATTRIBUTES
、FORM_ATTRIBUTES
等),您应该一切顺利。
我在用户模型上的一个字段中有多个复选框。复选框选择当前存储为数组。我正在尝试为用户在管理仪表板的编辑视图中重新创建多个复选框,但不确定如何(文档中的选项似乎没有涵盖这一点)。
这里是引入字段的迁移:
class AddEmploymentTypesToUser < ActiveRecord::Migration[6.0]
def change
add_column :users, :employment_types, :text, array:true, default: []
end
end
我想在仪表板编辑视图中重新创建的用户表单中的 UI:
该表格的代码:
<div class="form-group">
<label class="font-weight-bold" for="">What type of employment are you looking for?</label>
<br>
<%= f.check_box :employment_types, { :multiple => true }, 'Full-time', nil%> Full-time
<br>
<%= f.check_box :employment_types, { :multiple => true }, 'Part-time', nil%> Part-time
<br>
<%= f.check_box :employment_types, { :multiple => true }, 'Freelance', nil%> Freelance
<br>
<%= f.check_box :employment_types, { :multiple => true }, 'Contract-to-hire', nil%> Contract-to-hire
</div>
check_box_tag
就是您要找的。阅读更多 here
<div class="form-group">
<label class="font-weight-bold" for="">What type of employment are you looking for?</label>
<% ['Full-time', 'Part-time', 'Freelance', 'Contract-to-hire'].each do |type| %>
<%= check_box_tag "put_your_form_model_here[employment_types][]", type, uniq_number_that_you_want_for_each_type %>
<% end %>
</div>
您必须为此提供自定义字段类型,因为 Administrate 提供的字段类型在这里并不适用。我很确定这样做的原因是这种字段可以通过多种方式实现,因此 Adminstrate 无法提供单一、统一的解决方案。
要创建新字段,继承自 Administrate::Field::Base
:
### app/fields/checkbox_list.rb
class CheckboxList < Administrate::Field::Base
def self.permitted_attribute(attr, _options = nil)
# Yes, this has to be a hash rocket `=>`,
# not a colon `:`. Otherwise it will be the key
# `attr` (literally) as opposed to a key whose name
# is the value of the argument `attr`.
{ attr => [] }
end
def choices
options[:choices]
end
end
针对您的具体情况,我正在实施两种方法。我会一一解释。
首先是self.permitted_attribute
。这是一个 API,Administrate 内部使用它来弄清楚如何将您的新字段类型转换为 params.require(...).permit(...)
.
因为您的字段被建模为复选框列表,params
会将其视为一个数组:
params[:user]
# => { name: "Conway Anderson", employment_types: ["Freelance", "Contract-to-hire"] }
告诉 permit
接受这个,通常你在 Rails 应用程序中这样做:
params.require(:user).permit(:name, employment_types: [])
通过像我上面那样实现 CheckboxList.permitted_attributes
,Adminstrate 传递正确的信息 (employment_types: []
) 以允许:它表示允许 employment_types
,这将是一个数组值。您可能已经在其他地方的应用程序中这样做了?
这是第一种方法!现在是第二个:choices
。这是从 options
读取的,它是提供给仪表板定义中的字段的选项列表。例如这里:
ATTRIBUTE_TYPES = {
id: Field::Number,
name: Field::String,
# ...
employment_types: CheckboxList.with_options(choices: ['Full-time', 'Part-time', 'Freelance', 'Contract-to-hire']),
}.freeze
这样,CheckboxList
可以重复用于不同的选择列表。请注意,我没有使用 options
这个词,因为 Administrate::Field::Base
已经在内部使用了它,这会产生冲突。
继续,您的字段还需要模板部分,以告诉 Rails 如何呈现它。这些放在 views/
文件夹中,例如可以这样查找:
### app/views/fields/checkbox_list/_index.html.erb
<%= field.data.join(', ') %>
### app/views/fields/checkbox_list/_show.html.erb
<%= field.data.join(', ') %>
### app/views/fields/checkbox_list/_form.html.erb
<div class="field-unit__label">
<%= f.label field.attribute %>
</div>
<div class="field-unit__field">
<%= f.collection_check_boxes field.attribute, field.choices, :itself, :itself %>
</div>
最棘手的是表格。请注意,我使用 field.choices
,它与 class CheckboxList
中定义的方法 choices
相同,并且从仪表板中给出的选项中读取。
我想就是这样!将新字段和类型添加到您的仪表板(不要忘记将其添加到 SHOW_PAGE_ATTRIBUTES
、FORM_ATTRIBUTES
等),您应该一切顺利。