自定义验证的本地化

时间:2017-12-01 12:31:44

标签: ruby-on-rails rails-i18n

我正在开展一个项目,我希望将应用中使用的所有字符串移动到一个文件中,以便轻松更改和更新它们。但是我在自定义验证方面遇到了麻烦。我的应用程序中的验证如下:

validate :thing_is_correct

def thing_is_correct
  unless thing.is_correct
    errors[:base] << "Thing must be correct"
  end
end

我不确定如何将“Thing must correct”移动到我的en.yml文件中并移出模型。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以访问模型中的I18n。

validate :thing_is_correct

def thing_is_correct
  unless thing.is_correct
    errors[:base] << I18n.t('mymodel.mymessage')
  end
end

内部config/locales/en.yml

en:
  mymodel:
    mymessage: "Thing must be correct"

在另一个区域设置中:(config/locales/es.yml

es:
  mymodel:
    mymessage: "Esto debe ser correcto"

如果您设置I18n.locale = :en,则会显示en.yml内的消息。如果您将其设置为:es,则会使用es.yml内的{。}}。

答案 1 :(得分:0)

Rails这样做的方法是使用the mechanism described in the Guides

errorsActiveModel::Errors的一个实例。可以通过调用ActiveModel::Errors#add添加新消息。正如您在文档中看到的那样,您不仅可以传递消息,还可以传递表示错误的符号:

def thing_is_correct
  unless thing.is_correct?
    errors.add(:thing, :thing_incorrect)
  end
end

Active Model将自动尝试从指南中描述的命名空间中获取消息(请参阅上面的链接)。实际消息是使用ActiveModel::Errors#generate_message生成的。

总结一下:

  1. 使用errors.add(:think, :thing_incorrect)
  2. the YAML keys listed in the Guides之一下添加thing_incorrect