我已经完成了一些研究,但没有设法找到如何本地化我的表单对象的属性。
以下是表单对象模型的相关部分:
class Pledge
include ActiveModel::Validations
include ActiveModel::Conversion
include ActiveAttr::Attributes
extend ActiveModel::Naming
attribute :pledge_amount
attribute :reward_id
attribute :message
validates :message, presence: true, length: { maximum: 140 }
validates :reward_id, presence: true
validates :pledge_amount, presence: true
...
end
我的语言环境文件,pledges / en.yml:
en:
activerecord:
models:
pledge: "Pledge"
attributes:
pledge:
pledge_amount: "Pledge Amount"
reward_id: "Reward"
message: "Message"
helpers:
submit:
pledge:
create: "Next Step"
label:
pledge:
pledge_amount: "Enter your pledge amount"
reward_id: "Select your reward"
message: "Write a Support Message"
通过这种设置,我成功地在表单上本地化了标签,这是表单代码的一部分:
<%= form_for @pledge do |f| %>
<% if @pledge.errors.any? %>
<div id="error_explanation">
<h2><%= t :not_saved, count: @pledge.errors.count, model: t(:pledge) %></h2>
<ul>
<% @pledge.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
...
<%= f.label :pledge_amount %>
<%= f.text_field :pledge_amount %>
...
<%= f.submit class: "btn btn-lg btn-primary" %>
<% end %>
这使得:pledge_amount标签如下:“输入您的承诺金额”英文,并且:提交按钮为“下一步”,很棒。
当验证失败并且我使用标签下的代码错误呈现表单时会出现问题,女巫会给我模型中存在的错误但是带有空白的属性名称,如下所示:
one error prohibited this Pledge from being saved:
- can't be blank
什么时候呈现:
one error prohibited this Pledge from being saved:
- Pledge Amount can't be blank
如果您对此消息感到好奇,特别是此处的代码,缩写为:
错误/ en.yml
en:
not_saved:
one: "one error prohibited this %{model} from being saved:"
other: "%{count} errors prohibited this %{model} from being saved:"
errors:
format: "%{message}"
activerecord:
errors:
messages:
blank: "%{attribute} can't be blank"
这适用于我的所有其他模型,但由于某些原因它不起作用,我认为我在我的pledges / en.yml文件中使用了错误的密钥,因为我的Pledge模型没有继承自ActiveRecord ......
有人知道实现这个目标的正确关键吗?
答案 0 :(得分:8)
将翻译放在activemodel
而不是activerecord
的yaml:
en:
activemodel:
models:
pledge: "Pledge"
attributes:
pledge:
pledge_amount: "Pledge Amount"
reward_id: "Reward"
message: "Message"
我从old RailsCast的评论中挖出了这个答案。见Greg Yardley的评论。
答案 1 :(得分:0)
我设法通过在我的表单对象中的每个验证中添加自定义消息来部分解决此问题,如下所示:
validates :pledge_amount, :presence => { :message => I18n.t(:blank_pledge_amount) }
我的en.yml文件
blank_pledge_amount: "Please insert a pledge amount"
这种方式工作正常,但如果有人有更好的解决方案,我仍然想知道更好的解决方案。 我希望这可以帮助其他人解决同样的问题。
为了验证消息属性的存在和长度,使用他们的消息我都这样做:
validates_presence_of :message, :message => I18n.t(:blank_message)
validates_length_of :message, :maximum => 140, message: I18n.t(:message_too_long)