我正在使用Ruby on Rails 3,我试图理解控制器中before_filter
方法的行为。
在我的控制器中我有
class UsersController < ApplicationController
before_filter :authorize
def show
...
end
end
例如,如果我浏览页面http://<my_web_site>/user/1
(加载了来自ID为1的用户填充数据的users/show.html.erb
视图文件),before_filter
也可以。也就是说,authorize
方法可以做它必须做的事情。
如果我将users/show.html.erb
视图文件作为另一个控制器的模板(例如:PostsController)以这种方式呈现
# This code is in the `post/show.html.erb` file
<%= render :template => "/users/show", :locals => { :user => @user } %>
before_filter
不起作用。也就是说,authorize
方法接缝不会运行。
为什么?这种行为是有原因的还是我错了?
更新(在@brad评论之后)
您是将该视图渲染为 来自用户内的部分模板 控制器?如果不是before_filter 不适用
如果正如@brad在评论中所说,如何让before_filter
为另一个控制器渲染该视图而不是UsersController?
答案 0 :(得分:1)
将authorize方法移至ApplicationController
将before_filter添加到要检查用户授权的每个控制器。
答案 1 :(得分:0)
当您渲染模板或视图文件/部分时,它实际上并不被视为您的控制器上的请求,因此过滤器不适用。
答案 2 :(得分:0)
首先,您应该了解Rails中的路由。当您在浏览器中输入http://<my_web_site>/user/1
时,它会转到route
文件,然后转到正确的控制器操作,然后该控制器启动渲染视图。并且控制器具有这些回调,当启动某些操作时,这些回调应该在控制器的操作之前或之后起作用。因此,在您的情况下,您将调用部分模板而不涉及任何控制器
答案 3 :(得分:0)
before_filter
适用于控制器操作,而不是呈现操作。
然后,一个解决方案是将授权逻辑抽象为可以在渲染部分时使用的帮助程序:
if authorized?
render :partial => 'users/show'
end
另一种解决方案是在模型级别实施授权,使用类似declarative_authorization
gem(https://github.com/stffn/declarative_authorization)