filter有很多复杂的应用,如果比较简单地使用就直接映射到函数上去,如果统一管理规划就定义类。
一般来说都是映射到函数上。
说几个常用的fitler:
这是定义filter
:auth是函数名,定义在后面,:except是例外,也就是对login这个action不经过filter,当然了,在没登录前是不需要验证用户的。
auth的定义:
这里写了这么多废话,主要是防止非admin用户登录。另外缺省初始化一个@login_user。还有非常简略的写法,不过不好看。
redirect_login()函数在另外地方定义,就是一个简单的重定向。
这次是用around filter,catch_error的定义如下:
这里做了一个转换,将action_name转成了err_<action_name>,这个必须要在国际化文件中定义,这样就会输出正确的错误信息。使用了globalite来做国际化。
exception_log是一个记录log的函数。
所有出错都返回index。
yield这里显然就是运行各个action的地方。
一般来说都是映射到函数上。
说几个常用的fitler:
登录
这是定义filter
ruby 代码
- before_filter :auth, :except => [:login]
auth的定义:
ruby 代码
- def auth
- user_id=session[:user_id]
- if !user_id.nil?
- @login_user=User.find(user_id)
- if !@login_user.admin_manage?
- @login_user=nil
- end
- else
- @login_user=nil
- end
- if @login_user==nil
- redirect_login()
- end
- end
这里写了这么多废话,主要是防止非admin用户登录。另外缺省初始化一个@login_user。还有非常简略的写法,不过不好看。
redirect_login()函数在另外地方定义,就是一个简单的重定向。
处理通用异常
定义filter:ruby 代码
- around_filter :catch_error
这次是用around filter,catch_error的定义如下:
ruby 代码
- def catch_error
- yield
- rescue => detail
- exception_log("#{action_name} error:",detail)
- flash[:notice]= "err_#{action_name}".to_sym.l("#{action_name} error")+" : #{$!}"
- if action_name != "index"
- redirect_to(:action=>"index")
- end
- end
这里做了一个转换,将action_name转成了err_<action_name>,这个必须要在国际化文件中定义,这样就会输出正确的错误信息。使用了globalite来做国际化。
exception_log是一个记录log的函数。
所有出错都返回index。
yield这里显然就是运行各个action的地方。