论坛首页 编程语言技术论坛

可定制的Rails错误回显

浏览 11341 次
精华帖 (1) :: 良好帖 (13) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-16   最后修改:2009-09-16
通常rails页面的错误信息提示都是放在首部用 error_message_for,生成这样的错误提示:


这样很快就把所有错误信息都显示出来了。但是有一个缺点,就是灵活性太差。感觉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:



   发表时间:2009-09-16  
[北京小C]:顶
很好的解决方案
0 请登录后投票
   发表时间: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 完成。最后输出的错误信息就是中文的并且合符格式的了。
1 请登录后投票
   发表时间:2009-09-16  
这样分离显示的界面更友好。
0 请登录后投票
   发表时间:2009-09-16  
night_stalker 写道
貌似用 i18n 也可以定制 …… 而且更简单些

我只知道I18N可以把field名字国际化,但是如何使错误信息在页面布局可控还不知道怎么做
0 请登录后投票
   发表时间: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: "必须为双数"
1 请登录后投票
   发表时间: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 => "不能为空"

5 请登录后投票
   发表时间:2009-09-16   最后修改:2009-09-16
我的想法一直是这样的:我打算直接不理这个验证错误的提示,反正前端有js挡着,就不用费功夫去搞这些了。model验证我认为主要是保证数据的正确性,而js的验证则是为了用户体验。对于那种能想办法绕过前端验证的家伙,就无所谓什么用户体验了吧。对于用web却禁掉js的家伙直接不予支持。

我觉得没有什么问题,大家认为如何?
0 请登录后投票
   发表时间:2009-09-16   最后修改:2009-09-16
- -,再添加这个:
zh-cn:
  users:
    name: 法号
    password: 芝麻开门

就显示为:

芝麻开门与确认值不匹配
法号已经被使用

不用每个字段都加 :message => ...
0 请登录后投票
   发表时间: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文本框右边或下面的需求,而且这个需求也是完全正当的...
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics