Ruby on rails RubyonRails:在一个控制器中执行相同的签入多个操作

Ruby on rails RubyonRails:在一个控制器中执行相同的签入多个操作,ruby-on-rails,security,model-view-controller,Ruby On Rails,Security,Model View Controller,首先,如果这是一个重复的问题,我深表歉意。我试图找到答案,但由于我对Rails非常陌生,我不知道该搜索什么 我有一个控制器,上面有一些安全装置。对于显示、编辑、更新和销毁操作,我需要检查用户是否拥有他们正在处理的角色,如下所示: if @persona.user_id != @current_user.id flash[:notice] = "Sorry, we couldn't find that persona" redirect_to '/personas/' else

首先,如果这是一个重复的问题,我深表歉意。我试图找到答案,但由于我对Rails非常陌生,我不知道该搜索什么

我有一个控制器,上面有一些安全装置。对于显示、编辑、更新和销毁操作,我需要检查用户是否拥有他们正在处理的角色,如下所示:

if @persona.user_id != @current_user.id

  flash[:notice] = "Sorry, we couldn't find that persona"
  redirect_to '/personas/'

else

  # do something else
class PersonasController < ApplicationController
  before_filter :check_owner, :only => [:show, :edit, :update, :destroy]

  def show
  #...
  end

  #...etc.

  protected

  def check_owner
    redirect_to personas_path unless params[:id] == current_user.id
  end
end
class ApplicationController < ActionController::Base
  helper_method :current_user

  def current_user
    @current_user ||= session[:user_id] ? User.find(session[:user_id]) : User.new
  end
end
这是相对容易的。但是,如何以干燥的方式进行此操作?else之前的代码在所有4个操作中重复,else语句之后的代码在每个控制器上都不同

提前谢谢


Richard

在筛选之前使用
以下是概述:


要使其干燥,还应编写一个
current\u user
方法,返回登录用户

您需要在过滤器之前使用
。大概是这样的:

if @persona.user_id != @current_user.id

  flash[:notice] = "Sorry, we couldn't find that persona"
  redirect_to '/personas/'

else

  # do something else
class PersonasController < ApplicationController
  before_filter :check_owner, :only => [:show, :edit, :update, :destroy]

  def show
  #...
  end

  #...etc.

  protected

  def check_owner
    redirect_to personas_path unless params[:id] == current_user.id
  end
end
class ApplicationController < ActionController::Base
  helper_method :current_user

  def current_user
    @current_user ||= session[:user_id] ? User.find(session[:user_id]) : User.new
  end
end

您可能需要调整所有这些,因为这将取决于您如何设置模型。这只是您需要/应该做什么的一般概念。

您可以将安全逻辑移到before\u过滤器。它将在您的操作之前运行,并进行安全检查

您的控制器文件:

class TestController

   before_filter :check_persona, :only => [:show, :edit, :update, :destroy]

   private

      def check_persona
         if @persona.user_id != @current_user.id
            flash[:notice] = "Sorry, we couldn't find that persona"
            redirect_to '/personas/'
         end
      end

end

这可能不起作用,因为
@persona
可能是在调用
before\u filter
之后在方法中设置的。它也可以在before\u filter中加载。