Nic*_*fal 7 ruby validation ruby-on-rails internationalization
任何人都有一些提示如何翻译Rails中的模型关联?
例如:我有一个Person模型,可以有很多Phone.但是,一个人需要至少有一部电话.我无法翻译该验证.我能做的最好的就是:
validates_presence_of :phones, :message => "At least one phone is required."
Run Code Online (Sandbox Code Playgroud)
在我的YAML上,我更换了这一行以省略%{attribute}:
format: ! '%{message}'
Run Code Online (Sandbox Code Playgroud)
这样只显示我的消息,并且我避免显示未翻译的字段名称.
这让我很头疼,因为有些宝石根本不允许我通过:message => "something describing the error",所以我想通过我的YAML配置所有错误消息.
此外,对于某些模型,我能够翻译他们的属性,而与其他人我不是.例如:
activerecord:
attributes:
additional_info:
account_manager: "Manager"
Run Code Online (Sandbox Code Playgroud)
这有效.我可以在我的表格"经理"上看到.但是,当此字段有错误时,Rails会将其显示为"Additional info account manager can't be blank".
我试过这个:
activerecord:
errors:
models:
additional_info:
attributes:
account_manager: "Manager"
Run Code Online (Sandbox Code Playgroud)
但没有运气.
我确实阅读了文档,但没有找到它为什么会发生的线索.
Nic*_*fal 10
Rails 3.2改变了这种行为.我之前发布的方式已被弃用.
现在,为了翻译关联,需要添加斜杠(而不是嵌套所有东西).所以不是这样的:
activerecord:
attributes:
person:
additional_info:
account_manager: "Manager"
Run Code Online (Sandbox Code Playgroud)
现在正确的是:
activerecord:
attributes:
person:
additional_info/account_manager: "Manager"
Run Code Online (Sandbox Code Playgroud)
此外,我发现has_many协会的翻译方式与此不同.如果要翻译它们,以下示例可能会有所帮助:
activerecord:
attributes:
emails:
address: "E-mail field"
Run Code Online (Sandbox Code Playgroud)
我不需要像上面那样使用模型名称,而是需要传递关联名称emails.
查看此评论并提取更多信息请求:
https://github.com/rails/rails/commit/c19bd4f88ea5cf56b2bc8ac0b97f59c5c89dbff7#commitcomment-619858
https://github.com/rails/rails/pull/3859
Jam*_*son 10
以下是Rails 4.1的有效密钥路径:
# Basic Attribute on Model
activerecord:
attributes:
#{model_class.model_name.i18n_key}:
#{attribute_name}:
"Localized Value"
# Attribute on Nested Model
activerecord:
attributes:
#{model_class.model_name.i18n_key}/#{association_name}:
#{attribute_name}:
"Localized Value"
#{association_name}:
#{attribute_name}:
"Fallback Localized Value"
Run Code Online (Sandbox Code Playgroud)
因此,鉴于这种模式(具有i18n_key的:person):
class Person
has_many :friends
end
Run Code Online (Sandbox Code Playgroud)
你有这些语言环境定义:
activerecord:
attributes:
person:
first_name:
"My Name"
person/friends:
first_name:
"My Friend's Name"
friends:
first_name:
"A Friend's Name"
Run Code Online (Sandbox Code Playgroud)
如果您的模型是命名空间,例如:
class MyApp::Person
has_many :friends
end
Run Code Online (Sandbox Code Playgroud)
将i18n_key成为:my_app/person你的/关键开始穿出来:
activerecord:
attributes:
my_app/person:
first_name:
"My Name"
my_app/person/friends:
first_name:
"My Friend's Name"
friends:
first_name:
"A Friend's Name"
Run Code Online (Sandbox Code Playgroud)