Ruby on rails RubyonRails:在一个控制器中执行相同的签入多个操作
首先,如果这是一个重复的问题,我深表歉意。我试图找到答案,但由于我对Rails非常陌生,我不知道该搜索什么 我有一个控制器,上面有一些安全装置。对于显示、编辑、更新和销毁操作,我需要检查用户是否拥有他们正在处理的角色,如下所示: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
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中加载。