2009-09-28 62 views
3

我想要一个过滤器之前像“must_have_permission_to_write”,当被调用时,如果用户没有写权限渲染消息说“你不能这样做!”并返回。rails:在过滤器之前插入和中断

问题是我得到“只能呈现或重定向一次每个动作”当然... 我怎样才能停止执行过滤器之前? 感谢

回答

3

我认为最简单的答案就是添加一个重定向并返回false您must_have_permission_to_write方法。

def must_have_permission_to_write 
    unless current_user.has_permission?(something) 
    redirect_to access_denied_path 
    return false 
    end 
end 

然后,创建地方拒绝访问的动作,添加路由,并把任何你想要的模板。

+3

这个“并返回false”的东西似乎有点危险,可以用作模式。如果redirect_to返回nil,则返回nil。将“返回false”放在单独的行上可能是更好的方法。 – tadman 2009-09-28 17:24:00

+0

良好的通话,在答案 – Ben 2009-09-28 19:22:33

+2

@tadman +1中修复,不幸的是它是一种根深蒂固到“Rails方式”的反模式。我想看到它也会消失。 – 2011-04-21 18:12:01

-1

只需添加and return,像做:

before_filter :must_have_permission_to_write 

def must_have_permission_to_write 
    redirect_to login_path and return unless current_user 
end 
+0

-1'return'将从方法中返回nil(而不是从它所调用的动作中),它不会执行任何操作。您必须从过滤器方法返回false。另外,请参阅tadman对本答案的回应。 – 2011-04-21 18:13:38

0

有几件事我注意到了有关的职位在这里:

  • 调用渲染或重定向过滤器之前,将取消该操作。当Rails没有这样做时有一点,但据我所知,现在是自动的。我似乎无法找到这个在线的参考,有人请纠正我,如果我错了。
  • 使用“和返回”是取消动作的好方法,如果您确实在动作中。在上面的例子中,方法被定义为before过滤器(即单独的方法)在方法结束时调用“并返回”,并没有那么有用。
  • 我不认为你应该告诉某人“你不能这样做”,那不是一个非常安全的做法。如果有人要求他们没有权限的东西,答案应该是404。通过这样的回答,你给这个“好奇”的人提供了太多的信息。
相关问题