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 模型的翻译