权威性删除(不仅如此)

时间:2010-08-21 11:30:31

标签: ruby-on-rails

让我们看看控制器:

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。 什么是不重复自己的正确方法?

2 个答案:

答案 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调用它。