Ruby on rails Rails cancan与before_过滤器一起出现问题
我最近将cancan 1.6.9集成到我的Rails 3.2.10项目中以获得授权,但我遇到了在before_过滤器中手动加载资源的问题。下面是对我的场景的简要描述 在config/routes.rb中,我有以下条目Ruby on rails Rails cancan与before_过滤器一起出现问题,ruby-on-rails,ruby-on-rails-3,cancan,Ruby On Rails,Ruby On Rails 3,Cancan,我最近将cancan 1.6.9集成到我的Rails 3.2.10项目中以获得授权,但我遇到了在before_过滤器中手动加载资源的问题。下面是对我的场景的简要描述 在config/routes.rb中,我有以下条目 resources :users match '/profile', :to => 'users#show' 下面是我的用户\u controller.rb的样子 class UsersController < ApplicationController befo
resources :users
match '/profile', :to => 'users#show'
下面是我的用户\u controller.rb的样子
class UsersController < ApplicationController
before_filter :load_show_resource, :only => :show
load_and_authorize_resource
...
def show
end
...
private
def load_show_resource
@user = params[:id] ? User.find(params[:id]) : current_user
end
end
无论参数[:id]是否存在,cancan都不应该使用正在显示操作的before_筛选器中手动加载的资源吗
有趣的是,如果我修改了我的用户控制器,请参见下面使用skip\u load\u和\u authorize\u resource:only=>:show并手动调用authorize!在show操作中,两个URL都起作用。此外,如果我删除cancan,两个URL都可以工作
...
can [:show, :update], User, :id => user.id
cannot [:show, :update, :destroy], User do |u|
u.site_id != user.site_id
end
....
class UsersController < ApplicationController
load_and_authorize_resource
skip_load_and_authorize_resource :only => :show
...
def show
@user = params[:id] ? User.find(params[:id]) : current_user
authorize! :show, @user
end
...
private
def load_show_resource
@user = params[:id] ? User.find(params[:id]) : current_user
end
end
所以,我的问题是,为什么在中的覆盖加载中解释的内容在这种情况下不起作用
谢谢 如果您尝试将before_筛选器与skip_load_和authorize_资源工作流一起使用,会发生什么情况?
# controller
class UsersController < ApplicationController
load_and_authorize_resource, :except => :show
# skip_load_and_authorize_resource :only => :show
...
def show
@user = params[:id] ? User.find(params[:id]) : current_user
authorize! :show, @user
end
...
end
# ability.rb
can [:show, :update, :destroy], User do |u|
u.id == user.id && u.site_id == user.site_id
end