1

DepartmentGlobalize gem: :nameandを使用して属性を変換したモデルがあり:permalinkます。

:permalink:nameコールバックを使用して、部門の に基づいて自動的に生成され:before_validationます。

名前とパーマリンクを必須にしたいので、移行時に翻訳クラスに検証を追加し、null 制約を追加しませんでした。

class Department < ActiveRecord::Base
  translates :name, :permalink, fallbacks_for_empty_translations: true
  globalize_accessors

  before_validation :set_permalink, on: :create

  validates_associated :translations
  translation_class.validates :name, presence: true, length: { maximum: 255 }
  translation_class.validates :permalink, presence: true, length: { maximum: 255 }, uniqueness: { case_sensitive: false }

  private

  def set_permalink
    I18n.available_locales.each do |l|
      I18n.with_locale(l) { self.permalink = name.to_url }
    end
  end
end

 

class CreateDepartment < ActiveRecord::Migration
  def up
    create_table :departments do |t|
      # other attributes

      t.timestamps null: false
    end

    Department.create_translation_table! name: { type: :string, null: false }, permalink: { type: :string, null: false, index: { unique: true } }
  end

  def down
    Department.drop_translation_table!
    drop_table :departments
  end
end

しかし、部門を作成しようとすると、検証が失敗します。

irb(main):001:0> Department.create!(name_en: 'Tools', name_fr: 'Outils')
   (0.2ms)  BEGIN
  Department::Translation Exists (1.4ms)  SELECT  1 AS one FROM "department_translations" WHERE "department_translations"."permalink" IS NULL LIMIT 1
  Department::Translation Exists (0.3ms)  SELECT  1 AS one FROM "department_translations" WHERE "department_translations"."permalink" IS NULL LIMIT 1
  Department::Translation Exists (0.4ms)  SELECT  1 AS one FROM "department_translations" WHERE "department_translations"."permalink" IS NULL LIMIT 1
  Department::Translation Exists (0.3ms)  SELECT  1 AS one FROM "department_translations" WHERE "department_translations"."permalink" IS NULL LIMIT 1
   (0.2ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Translations permalink can't be blank, Translations is invalid

ただし、パーマリンクの検証と not null 制約を削除すると、部門を保存でき、パーマリンクはすべての翻訳に存在します。

検証が失敗する理由がわかりません...検証とパーマリンクの自動生成が連携するように設定するにはどうすればよいですか?

Rails 4.2.5 と Globalize 5 を使用しています。

4

0 に答える 0