美文网首页技术文程序员
Rails-i18n 国际化 初体验

Rails-i18n 国际化 初体验

作者: CbdFocus | 来源:发表于2016-03-30 13:12 被阅读1096次

在提交表单之后,如果模型validate不通过,会往@user.errors里加入失败信息,@user.save失败后重新渲染『new』时会展示错误提示。


错误提示

展示错误信息的模板:
app/views/shared/_error_messages.html.erb

<% if @user.errors.any? %>
    <div id="error_explanation">

      <div class="alert alert-danger">
        The form contain <%= pluralize(@user.errors.count, "error") %> :(
      </div>

      <ul>
        <% @user.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
        <% end %>
      </ul>

    </div>
<% end %>

# 注:
# 模板片段filename以下划线开头,
# 通过 <%= render 'shared/error_messages' %> 插入到 app/views/users/new.html.erb 中

activemodel中的错误信息处理:
/Users/cbd/.rvm/gems/ruby-2.3.0/gems/activemodel-4.2.6/lib/active_model/errors.rb

def full_messages
  map { |attribute, message| full_message(attribute, message) }
end

# Returns all the full error messages for a given attribute in an array.
#
#   class Person
#     validates_presence_of :name, :email
#     validates_length_of :name, in: 5..30
#   end
#
#   person = Person.create()
#   person.errors.full_messages_for(:name)
#   # => ["Name is too short (minimum is 5 characters)", "Name can't be blank"]

# Returns a full message for a given attribute.
#
#   person.errors.full_message(:name, 'is invalid') # => "Name is invalid"
def full_message(attribute, message)
  return message if attribute == :base
  attr_name = attribute.to_s.tr('.', '_').humanize
  attr_name = @base.class.human_attribute_name(attribute, default: attr_name)
  I18n.t(:"errors.format", {
    default:  "%{attribute} %{message}",
    attribute: attr_name,
    message:   message
  })
end

app/models/user.rb

## 密码验证
validates :password,length: {minimum: 6, message: "密码最少六位"}

# 这里的message就是长度验证失败时的错误信息
# 效果如上图

关于『Name,Email,Password』字样如何自定义为合适的中文,这里就要用到国际化的gem了——rails-i18n。

配置 config/application.rb

# 国际化
# # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :zh

新建文件 config/locales/zh.yml

zh:
  activerecord:
    attributes:
      user:
        name: "帐号"
        email: "邮箱"
        password: "密码"
        password_confirmation: "重复密码"
    errors:
      models:
        user:
          attributes:
            name:
              blank: "不得为空"
            email:
              blank: "不得为空"
            password:
              blank: "不得为空"
缺少的翻译会有提示

相关文章

网友评论

    本文标题:Rails-i18n 国际化 初体验

    本文链接:https://www.haomeiwen.com/subject/qgoslttx.html