Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails cancan与before_过滤器一起出现问题_Ruby On Rails_Ruby On Rails 3_Cancan - Fatal编程技术网

Ruby on rails Rails cancan与before_过滤器一起出现问题

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

我最近将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
  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