Department
Globalize gem: :name
andを使用して属性を変換したモデルがあり: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 を使用しています。