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.newuser.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.newuser.valid?user.errors.messages #=> { :mobile=>["不能为空", "已占用"] } user.errors.full_messages #=> [ "手机号 不能为空", "手机号 已占用"]
参考: