1

我在用户模型上的一个字段中有多个复选框。复选框选择当前存储为数组。我正在尝试在管理仪表板的编辑视图中为用户重新创建多个复选框,但不确定如何(文档中的选项似乎没有涵盖这一点)。

这是迁移介绍该领域:

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>
4

2 回答 2

3

您必须为此提供自定义字段类型,因为 Administrate 提供的字段类型在这里并不好。我很确定这样做的原因是这种字段可以通过多种方式实现,因此 Administrate 无法提供单一、统一的解决方案。

要创建新字段,请继承自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像我上面所做的那样实现,Administrate 传递了正确的信息 ( 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方法相同,并且从仪表板中给出的选项中读取。choicesCheckboxList

我认为就是这样!将新字段和类型添加到您的仪表板(不要忘记将其添加到SHOW_PAGE_ATTRIBUTESFORM_ATTRIBUTES等),您应该一切顺利。

于 2020-01-07T12:59:09.327 回答
0

check_box_tag就是你要找的。在这里阅读更多

<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>
于 2020-01-06T02:21:02.877 回答