2

enruの 2 つのロケールを持つバイリンガル Web サイトがあります。

サイトに i18n を実装したい。「globalize3」と「easy_globalize3_accessors」の gem を使用します。

標準フォームで作成および編集できる部門があります。ロケールは URL から指定されます:example.com/en/departments/またはexample.com/ru/departments/

ここで、新しい部門項目を作成したい場合、次のように表示されます。

  1. 現在のロケールのメイン フォーム (I18n.locale)。
  2. 同じページに翻訳を追加するためのチェックボックス。
  3. チェックボックスがアクティブな場合、メイン フォームのすぐ隣に別のロケールの別のフォームを表示します。
  4. 最も重要なことは、各ロケールの検証が異なる必要があることです。たとえば、enの場合は ASCII シンボルを渡す必要があります。for ru — キリル文字。

私の問題は番号 4 です。チェックボックスで検証を機能させることができません。

主な問題は次のとおりです。チェックボックスがアクティブですか?はいの場合は、別のフォームを表示して、そのフォームの検証を実行します。いいえの場合、何も表示せず、そのフォームの検証を実行せず、空にします。

今のところ、2 つのフォームに記入すれば、すべてが魔法のように機能します。

Ok。私が試したこと。

モデル

class Department < ActiveRecord::Base
  attr_accessible :name, :translations_attributes
  translates :name, fallbacks_for_empty_translations: true
  accepts_nested_attributes_for :translations

  # The inline class Translation is a hack to solve 
  # "Can't mass-assign protected attributes: locale"
  # See https://github.com/svenfuchs/globalize3/issues/128#issuecomment-11480650
  class Translation
    attr_accessible :locale, :name
    validates :name, uniqueness: true
    validates :name, format: {with: /\A[-а-яА-Я -]+\Z/},  if: ->(l) {l.locale.to_s == 'ru'}
    validates :name, format: {with: /\A[-a-zA-Z -']+\Z/}, if: ->(l) {l.locale.to_s == 'en'} 
  end
end

コントローラ

def new
  @department = Department.new
end

def create
  @department = Department.new(params[:department])
  @department.save ? (redirect_to action: :index) : (render :new)
end

チェックボックスなしで表示 (new.haml.html)

= form_for @department, url: {action: :create} do |f|
  %h2
    - f.globalize_fields_for_locale I18n.locale do |g|
      = "Translation for"
      = I18n.locale
      = g.label t("department.form.new.label.name")
      = g.text_field :name
  %hr
  %h2
    - I18n.available_locales.each do |locale|
      - next if locale == I18n.locale
      %br
      - f.globalize_fields_for_locale locale do |g|
        = "Translation for"
        = locale
        = g.label t("department.form.new.label.name")
        = g.text_field :name

  = f.submit t("department.create.link"), class: "btn"

私がしなければならないことを理解するのを手伝ってください。

4

0 に答える 0