Как отобразить несколько полей флажков в режиме редактирования панели управления администрирования?
У меня есть несколько флажков для одного из моих полей в пользовательской модели. Выбранные флажки в настоящее время хранятся в виде массива. Я пытаюсь воссоздать несколько флажков в режиме редактирования панели управления администратора для пользователя, но не знаю, как это сделать (параметры в документации, похоже, не охватывают это).
Вот миграция, представляющая поле:
class AddEmploymentTypesToUser < ActiveRecord::Migration[6.0]
def change
add_column :users, :employment_types, :text, array:true, default: []
end
end
Пользовательский интерфейс из моей пользовательской формы, который я хочу воссоздать в режиме редактирования панели:
Код для этой формы:
<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 ответа
Для этого вам нужно будет указать настраиваемый тип поля, поскольку те, которые предоставляет администратор, здесь не подходят. Я почти уверен, что причина этого в том, что такого рода поля можно реализовать разными способами, поэтому администратор не может предоставить единое унифицированное решение.
Чтобы создать новое поле, наследуйте от 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, который администратор использует внутри компании, чтобы понять, как преобразовать ваш новый тип поля в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, как его визуализировать. Они входят в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
и т. д.), и все будет в порядке.
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>