Administrateを使っていて、enumのプロパティをselectボックスで選ばせたかったので実装してみました。
実行環境
- Rails 5
- Administrate 0.8.1
方針
- Selectフィールドをベースにカスタマイズする
- 標準フィールドのように使いたい
Field::Enum
- 日本語訳したい
-
I18n
を使う
-
実装
ビューを追加する
$ rails generate administrate:field enum
app/views/fields/enum/_form.html.erb
<div class="field-unit__label">
<%= f.label field.attribute %>
</div>
<div class="field-unit__field">
<%= f.select(
field.attribute,
options_from_collection_for_select(
field.selectable_options,
:last,
:first,
field.data.presence,
)
) %>
</div>
app/views/fields/enum/_index.html.erb
<%= field.data %>
app/views/fields/enum/_show.html.erb
<%= field.data %>
フィールドを追加する
lib/administrate/field/enum.rb
require "administrate/field/base"
module Administrate
module Field
class Enum < Field::Select
def self.searchable?
true
end
def selectable_options
collection
end
private
def collection
if options.key?(:collection)
options.fetch(:collection, [])
else
if resource_class.respond_to?(collection_method)
resource_class.send(collection_method).map do |label, value|
[I18n.t("enums.#{resource_class.name.underscore}.#{collection_method}.#{label}"), value]
end
else
[]
end
end
end
def resource_class
@resource.class
end
def collection_method
if options.key?(:collection_method)
options.fetch(:collection_method)
else
@attribute.to_s.downcase.pluralize
end
end
end
end
end
実行例
プロフィールに性別を登録できるアプリを想定します。
app/models/profile.rb
class Profile < ApplicationRecord
enum sex: %i(male female)
end
config/locales/ja.yml
ja:
enums:
sexes:
male: 男性
female: 女性
app/dashboards/profile_dashboard.rb
require "administrate/base_dashboard"
class ProfileDashboard < Administrate::BaseDashboard
ATTRIBUTE_TYPES = {
sex: Field::Enum,
}.freeze
COLLECTION_ATTRIBUTES = [
sex: Field::Enum,
].freeze
SHOW_PAGE_ATTRIBUTES = [
sex: Field::Enum,
].freeze
FORM_ATTRIBUTES = [
sex: Field::Enum,
].freeze
end
実行結果
参考