Active Record 验证辅助方法的默认错误消息都是英文,为了提高用户体验,有时候我们经常会被要求按特定的文本展示错误信息。此时有两种实现方式。

1. 直接在:message添加文案

class User < ActiveRecord::Base
 validates :email,
presence: { message: '邮箱不能为空!' },
uniqueness: { message: '邮箱 %{value} 已存在!' }
validates :name,
presence: { message: '姓名不能为空!' },
length: { maximum: 255, too_long: '姓名最多为255个字符' }
end

验证一下:

user = User.new
user.valid?
user.errors.messages
#=> { :email=>["邮箱不能为空!"], :name=>["姓名不能为空!"]} 

2. 使用 rails国际化API

在config/locales文件下已经存在一个默认的en.yml文件,我们可以再添加一个 zh-CN.yml 文件作为中文的翻译

class ApplicationController < ActionController::Base
  before_action :set_locale
  def set_locale
     I18n.locale = user_locale
    # after store current locale
    cookies[:locale] = params[:locale] if params[:locale]
  rescue I18n::InvalidLocale
    I18n.locale = I18n.default_locale
  end

  protected
  def user_locale
    params[:locale] || cookies[:locale] || http_head_locale || I18n.default_locale
  end
  def http_head_locale
request.env['HTTP_ACCEPT_LANGUAGE']
end
end

设置每个key对应的翻译值

zh-CN:
  activerecord:
    attributes:
      taken: '已占用'
      blank: '不能为空'
      user:
        email: '邮箱'
        password: '密码'
        name: '姓名'
        mobile: '手机号'
    models:
      user: '用户'
    errors:
      messages:
        record_invalid: "%{errors}"
        taken: '已占用'
        blank: '不能为空'
      attributes:
        version: '版本'
  actions:
    create: '新增'
    update: '修改'
    destroy: '删除'

验证一下:

class User < ActiveRecord::Base
  validates :mobile,
            presence:   true,
            uniqueness: true,
end
user = User.new
user.valid?
user.errors.messages  #=> { :mobile=>["不能为空", "已占用"] } 
user.errors.full_messages  #=> [ "手机号 不能为空", "手机号 已占用"]

参考:

处理验证错误

Active Record 模型的翻译

 

内容来源于网络如有侵权请私信删除