0

この要点のおかげで使っglobalize3ています。私を悩ませているのは、ユーザーが好きなだけ翻訳を追加できることです。rails_admin

さらに、彼は(のように)すべてのロケールでコンテンツを翻訳することを強制されていませんI18n.available_locales。私はそれが欲しいです。どうすればそのような状況に取り組むことができますか?

モデル(短縮):

class Project < ActiveRecord::Base
    has_many :project_translations, :dependent => :destroy, :inverse_of => :project
    accepts_nested_attributes_for :project_translations, :allow_destroy => true

class ProjectTranslation < ActiveRecord::Base
    belongs_to :project
4

2 に答える 2

0

代わりにActiveAdminactiveadmin-globalize3を使用することになりました。はるかに簡単です。

于 2013-02-21T19:31:09.160 に答える
0

それも私を悩ませたので、それを許可しないカスタムフィールドタイプを作成しました。

メインクラス:

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

于 2013-08-27T20:57:32.340 に答える