我正在尝试将一个类用作多个控制器的前置过滤器。因为过滤器必须根据哪个控制器调用它来做稍微不同的事情,所以我似乎需要使用一个类作为过滤器,以便将控制器传入过滤器。
到目前为止,我有类似
的内容class ShowFilter
def self.filter(controller)
c_name = controller.controller_name
object_id = controller.params[:id]
case c_name
when "articles"
article = Article.find(object_id)
unless curr_user.can_see?(article)
controller.redirect_to(:controller => "articles", :action => "index")
end
when "images"
image = Image.find(object_id)
unless curr_user.can_see?(image)
controller.redirect_to(:controller => "images", :action => "index")
end
end
end
此类将在文章和 images 控制器中的 show 操作上调用为:before_filter。
我的问题是我收到一条错误消息,说'redirect_to'是一个受控制器传入过滤器的受保护方法。
如果我打电话
redirect_to(:controller => "images", :action => "index")
而不是
controller.redirect_to(:controller => "images", :action => "index")
我得到一个“未定义的方法'redirect_to'用于ShowFilter:Class”错误。
如果我将我的班级定义为
class ShowFilter < ApplicationController
我仍然遇到未定义的方法错误。我也有同样的问题访问闪存。
有没有办法在过滤器类内重定向?我应该使用不同的方法进行过滤,以便能够重定向和访问闪存吗?
答案 0 :(得分:1)
您可以使用controller.send(:redirect_to,“您的网址”)来绕过该方法的受保护级别。