Как отобразить несколько полей флажков в представлении редактирования панели управления «Администрирование»? - PullRequest
1 голос
/ 05 января 2020

У меня есть несколько флажков для одного из моих полей в пользовательской модели. Выбранные флажки в настоящее время хранятся в виде массива. Я пытаюсь воссоздать несколько флажков в представлении редактирования панели администратора для пользователя, но не знаю, каким образом (параметры в документах, кажется, не покрывают это).

Вот миграция, представляющая поле :

class AddEmploymentTypesToUser < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :employment_types, :text, array:true, default: []
  end
end

Пользовательский интерфейс из моей формы пользователя, который я хочу воссоздать в представлении редактирования панели управления: enter image description here

Код для этой формы:

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

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Для этого вам нужно будет указать тип настраиваемого поля, поскольку те, которые предоставляет Администрация, здесь не годятся. Я уверен, что причина этого в том, что поля такого типа могут быть реализованы разными способами, поэтому администратор не может предоставить единого унифицированного решения.

Чтобы создать новое поле, наследуйте от 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

Для вашего конкретного случая c я реализую два метода. Я объясню их индивидуально.

Во-первых, есть self.permitted_attribute. Это API, который администратор использует для внутреннего использования, чтобы выяснить, как преобразовать ваш новый тип поля в термины 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, как я это делал выше, Администрирование передает правильную информацию (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, как его визуализировать. , Они go в папке 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, который является тем же методом choices, определенным в классе CheckboxList, и который читает из опций, приведенных в панели управления.

И я думаю, что это так! Добавьте новое поле и введите его в свою панель (и не забудьте добавить его в SHOW_PAGE_ATTRIBUTES, FORM_ATTRIBUTES, et c), и вы должны быть хороши в go.

0 голосов
/ 06 января 2020

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