Rails如何从表单对象本地化属性

Rui*_*ila 3 forms activerecord ruby-on-rails internationalization

我已经做了一些研究,但没有设法找到如何本地化我的表单对象的属性.

这是我的表单对象模型的相关部分:

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
Run Code Online (Sandbox Code Playgroud)

我的语言环境文件,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"
Run Code Online (Sandbox Code Playgroud)

通过这种设置,我成功地在表单上本地化了标签,这是表单代码的一部分:

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)

这使得:pledge_amount标签如下:"输入您的承诺金额"英文,并且:提交按钮为"下一步",很棒.

当验证失败并且我使用标签下的代码错误呈现表单时会出现问题,女巫会给我模型中存在的错误,但是带有空白的属性名称,如下所示:

one error prohibited this Pledge from being saved:
 - can't be blank
Run Code Online (Sandbox Code Playgroud)

什么时候呈现:

one error prohibited this Pledge from being saved:
 - Pledge Amount can't be blank
Run Code Online (Sandbox Code Playgroud)

如果你对此消息感到好奇,特别是这里的代码,缩短了:

错误/ 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"
Run Code Online (Sandbox Code Playgroud)

这适用于所有我的其他机型,但对于这一个由于某种原因,这是行不通的,我觉得我用我的承诺/ en.yml文件错了键,我的承诺模型不从ActiveRecord的继承...

有人知道实现这个的正确关键吗?

ste*_*ser 10

翻译activemodel而不是activerecord你的yaml:

en:
  activemodel:
    models:
      pledge: "Pledge"
    attributes:
      pledge:
        pledge_amount: "Pledge Amount"
        reward_id: "Reward"
        message: "Message"
Run Code Online (Sandbox Code Playgroud)

我从旧RailsCast的评论中挖出了这个答案.请参阅Greg Yardley的评论.

  • 这应该是选定的答案. (2认同)