让我们看看控制器:
def destroy
if session[:user_id] && User.find(session[:user_id]).is_admin
@exam = Exam.find(params[:id])
@exam.destroy
else
redirect_to :back, :notice => "You cant do that!"
return
end
redirect_to :root
end
它在考试控制器中 但我想要类似地使用这个功能让我们说User_controller。 什么是不重复自己的正确方法?
答案 0 :(得分:0)
有几件事是重复的。对于查找内容,我建议inherited resources,对于授权,它更复杂。我们在每个模型中使用#may_be_deleted_by?(user)
(或更新/查看过)并将检查挂钩在IR的build/create/delete/update_resource
内。
答案 1 :(得分:0)
执行此操作的一般方法是向application_controller.rb
添加一个检查用户会话的方法(可能会传入用户),如果从会话中找到用户,则检查该用户是否{{1根据你的代码。
然后,从其他每个控制器开始,由于它们从is_admin
延伸,因此在您关注的任何操作上添加ApplicationController
(或任何您调用的方法)。您可以在所有想要使用它的控制器顶部重复before_filter :check_for_admin, :only => :destroy
行。授权逻辑被提取到它自己的方法。我们在几个项目中使用了AuthLogic这样的设置,您可以谷歌搜索特定的代码示例,但同样,一般模式是将常用控制器代码提取到app控制器并使用before_filter调用它。