3

私はgemを使用しています:globalize3とeasy_globalize3_accessors。検証に問題があります。たとえば、Postモデルがあります。

class Post
  translates :title, :content
  globalize_accessors :locales => [:en, :ru], :attributes => [:title, :content]
  validates :title, :content, :presence => true
end

とフォーム:

= form_for @post do |f|
  -I18n.available_locales.each do |locale|
    = f.text_field "title_#{locale}"
    = f.text_area "content_#{locale}"

ビューでは次のようになります(I18n.locale =:ruの場合):

<form action="/ru/posts" method="post">
  <input id="post_title_ru" name="post[title_ru]" type="text" />
  <textarea cols="40" id="post_content_ru" name="vision[content_ru]"></textarea>

  <input id="post_title_en" name="post[title_en]" type="text" />
  <textarea cols="40" id="post_content_en" name="vision[content_en]"></textarea>

  <input name="commit" type="submit" value="Создать Видение" />
</form>

フィールドにロシア語のみを入力すると検証に合格し、投稿したい場合は英語のみに入力し、英語のフィールドのみに入力すると(I18n.locale =:ruの場合)、検証は失敗します

Title can't be blank
Content can't be blank

私が理解しているように、属性に問題があります。検証では、最初の属性:title_ruと:content_ruのみがチェックされます。そして、残りの属性(:content_enおよび:title_en)に対して、チェックは到達しません。

属性の最初のグループの検証が渡されていないかどうかを確認するために2番目のデータバリデーターを作成する方法は?

前もって感謝します

4

2 に答える 2

5
validate :titles_validation

def titles_validation
  errors.add(:base, "your message") if [title_ru, title_en].all? { |value| value.blank? }
end
于 2012-08-29T14:04:47.187 に答える
3

問題は、globalize3が現在のロケールに関係なくタイトルを検証していることです。(現在のロケールだけでなく)すべてのロケールを検証する場合は、(@ apneadivingが指摘したように)各ロケールの属性のバリデーターを明示的に追加する必要があります。

以下を循環することにより、これらのバリデーターを自動的に生成できるはずですI18n.available_locales

class Post < ActiveRecord::Base
  I18n.available_locales.each do |locale|
    validates :"title_#{locale}", :presence => true
  end

  ...

end
于 2012-08-29T13:49:09.770 に答える