【问题标题】:Rails How to localize attributes from a form objectRails 如何本地化表单对象的属性
【发布时间】:2014-06-26 02:08:03
【问题描述】:

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

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

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

还有我的语言环境文件,promises/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 标签呈现为英文:“输入您的质押金额”,并将 :submit 按钮呈现为“下一步”,太棒了。

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

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"

这适用于我的所有其他模型,但由于某种原因它不起作用,我认为我在我的承诺/en.yml 文件中使用了错误的密钥,因为我的 Pledge 模型没有从 ActiveRecord 继承...

有人知道实现此目的的正确方法吗?

【问题讨论】:

    标签: ruby-on-rails forms activerecord internationalization


    【解决方案1】:

    将翻译放在您的 yaml 中的 activemodel 而不是 activerecord

    en:
      activemodel:
        models:
          pledge: "Pledge"
        attributes:
          pledge:
            pledge_amount: "Pledge Amount"
            reward_id: "Reward"
            message: "Message"
    

    我从old RailsCast 中的 cmets 中找到了这个答案。请参阅 Greg Yardley 的评论。

    【讨论】:

    • 它似乎有效,但我确实喜欢(对于另一个模型):en:activemodel:错误:模型:消息:属性:名称:空白:“请插入一个名称......”但是属性不要被翻译,它显示“不能为空白”而不是“消息不能为空白”,但通过我粘贴在这里的这种方法,它可以翻译。
    • 这应该是选择的答案。
    【解决方案2】:

    我设法通过在表单对象中的每个验证上添加自定义消息来部分解决此问题,如下所示:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多