锁定老帖子 主题:可定制的Rails错误回显
精华帖 (1) :: 良好帖 (13) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-16
最后修改:2009-09-16
这样很快就把所有错误信息都显示出来了。但是有一个缺点,就是灵活性太差。感觉error_message_for就像rails的scaffold一样可以快速搭建一个curd应用,但是定制性不高。 还好,rails的可扩展能力是很强的,你不喜欢里面的某一方法,你甚至可以去把他的源代码改了(当然不推荐这样做...),所以只有自己动手.. 看了下源码: # Returns the Errors object that holds all information about attribute error messages. def errors @errors ||= Errors.new(self) end 这一句就够了:原来每个ActiveRecord的实例都有一个errors方法。这个@errors就是所有rails其他错误信息处理封装的基础。 自己写了一个对每个model的field错误信息提取到div的方法,同时把汉化也加进去了,很简单。。 module ApplicationHelper def error_div(model, field, field_name) return unless model field = field.is_a?(Symbol) ? field.to_s : field errors = model.errors[field] return unless errors %Q( <div class="errors"> #{errors.is_a?(Array) ? errors.map{|e| field_name + e}.join(",") : field_name << errors} </div> ) end end demo: validation: class Post < ActiveRecord::Base validates_presence_of :title, :message => "不能为空" validates_length_of :title, :in => 2..10, :message => "长度不正确" end view: <% form_for(@post) do |f| %> <p> <%= f.label :title %><br /> <%= f.text_field :title %><%= error_div(@post, :title, "标题")%> </p> <p> <%= f.label :description %><br /> <%= f.text_area :description %> </p> <p> <%= f.submit 'Create' %> </p> <% end %> 效果1: 效果2: 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-16
[北京小C]:顶
很好的解决方案 |
|
返回顶楼 | |
发表时间:2009-09-16
最后修改:2009-09-16
貌似用 i18n 也可以定制 …… 而且更简单些:
1.environment.rb: config.i18n.default_locale = 'zh-cn' 2.给 ActiveRecord 加个中文 locale,控制错误消息的格式。 3.给 model 配置每个字段的翻译。 2 和 3 通过在 config/locales 里面添加 zh-cn.xxxxxx.yml 完成。最后输出的错误信息就是中文的并且合符格式的了。 |
|
返回顶楼 | |
发表时间:2009-09-16
这样分离显示的界面更友好。
|
|
返回顶楼 | |
发表时间:2009-09-16
night_stalker 写道 貌似用 i18n 也可以定制 …… 而且更简单些
我只知道I18N可以把field名字国际化,但是如何使错误信息在页面布局可控还不知道怎么做 |
|
返回顶楼 | |
发表时间:2009-09-16
最后修改:2009-09-16
Hooopo 写道 night_stalker 写道 貌似用 i18n 也可以定制 …… 而且更简单些
我只知道I18N可以把field名字国际化,但是如何使错误信息在页面布局可控还不知道怎么做 zh-cn.yml: 扔进 config/locales 里面 # Chinese (China) translations for Ruby on Rails # by tsechingho (http://github.com/tsechingho) ... ... activerecord: errors: template: header: one: "有 1 个错误发生导致「{{model}}」无法被保存。" other: "有 {{count}} 个错误发生导致「{{model}}」无法被保存。" body: "如下字段出现错误:" messages: inclusion: "不包含于列表中" exclusion: "是保留关键字" invalid: "是无效的" confirmation: "与确认值不匹配" accepted: "必须是可被接受的" empty: "不能留空" blank: "不能为空字符" too_long: "过长(最长为 {{count}} 个字符)" too_short: "過短(最短为 {{count}} 个字符)" wrong_length: "长度非法(必须为 {{count}} 个字符)" taken: "已经被使用" not_a_number: "不是数字" greater_than: "必须大于 {{count}}" greater_than_or_equal_to: "必须大于或等于 {{count}}" equal_to: "必须等于 {{count}}" less_than: "必须小于 {{count}}" less_than_or_equal_to: "必须小于或等于 {{count}}" odd: "必须为单数" even: "必须为双数" |
|
返回顶楼 | |
发表时间:2009-09-16
activerecord: errors: template: header: one: "有 1 个错误发生导致「{{model}}」无法被保存。" other: "有 {{count}} 个错误发生导致「{{model}}」无法被保存。" body: "如下字段出现错误:" messages: inclusion: "不包含于列表中" exclusion: "是保留关键字" invalid: "是无效的" confirmation: "与确认值不匹配" accepted: "必须是可被接受的" empty: "不能留空" blank: "不能为空字符" too_long: "过长(最长为 {{count}} 个字符)" too_short: "過短(最短为 {{count}} 个字符)" wrong_length: "长度非法(必须为 {{count}} 个字符)" taken: "已经被使用" not_a_number: "不是数字" greater_than: "必须大于 {{count}}" greater_than_or_equal_to: "必须大于或等于 {{count}}" equal_to: "必须等于 {{count}}" less_than: "必须小于 {{count}}" less_than_or_equal_to: "必须小于或等于 {{count}}" odd: "必须为单数" even: "必须为双数" 哈哈,ns估计又没仔细看帖....... 这部分只是把默认的错误信息换成中文,但是会出现这样囧的错误提示: 引用 password与确认值不匹配 name已经被使用 ... 这个只要在validation上面加:message选项就可以了 validates_presence_of :title, :message => "不能为空" |
|
返回顶楼 | |
发表时间:2009-09-16
最后修改:2009-09-16
我的想法一直是这样的:我打算直接不理这个验证错误的提示,反正前端有js挡着,就不用费功夫去搞这些了。model验证我认为主要是保证数据的正确性,而js的验证则是为了用户体验。对于那种能想办法绕过前端验证的家伙,就无所谓什么用户体验了吧。对于用web却禁掉js的家伙直接不予支持。
我觉得没有什么问题,大家认为如何? |
|
返回顶楼 | |
发表时间:2009-09-16
最后修改:2009-09-16
- -,再添加这个:
zh-cn: users: name: 法号 password: 芝麻开门 就显示为: 芝麻开门与确认值不匹配 法号已经被使用 不用每个字段都加 :message => ... |
|
返回顶楼 | |
发表时间:2009-09-16
night_stalker 写道 貌似用 i18n 也可以定制 …… 而且更简单些:
environment.rb: config.i18n.default_locale = 'zh-cn' 2.给 ActiveRecord 加个中文 locale,控制错误消息的格式。 3.给 model 配置每个字段的翻译。 2 和 3 通过在 config/locales 里面添加 zh-cn.xxxxxx.yml 完成。最后输出的错误信息就是中文的并且合符格式的了。 居然修的这么快... 这只是汉化,但是还没有解决我想把email域的错误信息放在email文本框右边或下面的需求,而且这个需求也是完全正当的... |
|
返回顶楼 | |