それも私を悩ませたので、それを許可しないカスタムフィールドタイプを作成しました。
メインクラス:
module RailsAdmin
module Config
module Fields
module Types
class GlobalizeTabs < RailsAdmin::Config::Fields::Association
RailsAdmin::Config::Fields::Types::register(:globalize_tabs, self)
register_instance_option :partial do
:form_globalize_tabs
end
def method_name
"#{super}_attributes".to_sym
end
# Reader for validation errors of the bound object
def errors
bindings[:object].errors[name]
end
def available_locales
I18n.available_locales
end
def current_locale
I18n.locale
end
# Returns array of Translation objects
# It gets existing or creates new empty translation for every locale
# It's used in fields_for method in partial
def translations
translated_locales = @bindings[:object].translated_locales
available_locales.collect do |locale|
translated_locales.include?(locale) ? @bindings[:object].translation_for(locale) : @bindings[:object].translations.new({ locale: locale })
end
end
end
end
end
end
end
部分的(has_manyタイプで使用される)とRailsAdmin::Config::Fields::Association
非常によく似ているため、クラスから継承します。_form_nested_many
部分的:
.controls
= form.errors_for(field)
%ul.nav.nav-tabs{ :style => 'margin-top:5px' }
- field.available_locales.each do |locale|
%li{ class: ( 'active' if locale == field.current_locale ) }
%a{ href: "##{locale}", data: { toggle: "tab" } }= locale
.tab-content
= form.fields_for field.name, field.translations, wrapper: false do |nested_form|
.fields.tab-pane{ id: nested_form.object.locale, class: ( 'active' if nested_form.object.locale == field.current_locale ) }
= nested_form.generate({:action => :nested, :model_config => field.associated_model_config, :nested_in => field.name })
= form.help_for(field)
これはfield.translations
、Translationオブジェクトの配列を返すカスタムフィールドクラスのメソッドを使用します。すべてのトランスレーションオブジェクトは使用可能なロケールに対応しており、データベースの既存のオブジェクト(トランスレーションがすでに存在する場合)または新しい空のトランスレーションオブジェクトのいずれかです。
例えば
この利用可能なロケールがあります:
I18n.available_locales = [:en, :cz, :ru]
いくつかの翻訳されたフィールドを含むページモデルがあります。
また、クラスPage(データベース内の行)のオブジェクトがあります。このオブジェクトには、:enおよび:czロケールの翻訳がありますが、:ruの翻訳はありません。
したがって、 partialfield.translations
内のメソッド_form_globalize_tabs
は、:enと:czの2つの既存の変換と、:ruの初期化された1つの変換を含む配列を返します。
fields_for
部分的に、この配列をgemからhelperメソッドに渡します。このメソッドはnested_form
、翻訳オブジェクトごとに3つのフィールドセットを返します。
自分でコードをいじりたくない場合は、このgemを使用できます:https ://github.com/scarfaceDeb/rails_admin_globalize_field