Для этого вам нужно будет указать тип настраиваемого поля, поскольку те, которые предоставляет Администрация, здесь не годятся. Я уверен, что причина этого в том, что поля такого типа могут быть реализованы разными способами, поэтому администратор не может предоставить единого унифицированного решения.
Чтобы создать новое поле, наследуйте от 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.