Rails CanCan只有当前用户可以通过编辑

时间:2013-07-12 04:43:40

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 authorization cancan

我有一些自定义rake路线,我正在尝试使用CanCan,目的是只允许当前用户编辑自己帐户的页面。我的网址示例是 - > url.com/users/4/service/edit

我有一个带有操作的用户控制器:

  def services
    @user = User.find(params[:id])

    @servicable = @user
    @services = @servicable.services
    @service = Service.new
    authorize!(:services, @user || User)
  end

问题在于每次进入编辑页面时,我都会被重定向到索引页面。即使我正在尝试编辑自己的服务。

假设我的用户ID为4,我进入url.com/users/4/services/edit,我会转到索引页面。如果我尝试使用其他用户ID,这也是苹果 - > url.com/users/3/services/editusers/2/services/editusers/63/services/edit等等......

我希望能够访问我自己的编辑页面,但不能访问其他页面。

我的路线是这样的:

resources :users do
   resources :services, :defaults => { :servicable => 'user' }
end

编辑:这是我的能力

  def initialize(user)
    user ||= User.new #guest user

    if user.role? :admin
      can :manage, :all
      can :manage, User
    elsif user.role? :business
      can [:show, :update], User, :id => user.id 
    elsif user.role? :resident
      can [:show, :update], User, :id => user.id 
    else
      can [:show, :update], User, :id => user.id
  end

编辑#2:

这是来自services_controller

  def edit
    @service = @servicable.services.find(params[:id])
  end

请忽略顶部的路线:我正在使用的正确路线是这样的

resources :users do
  member do
    get 'services', :path => 'services/edit', :defaults => { :servicable => 'user' }
  end
end

1 个答案:

答案 0 :(得分:2)

您需要在Ability.rb中定义权限,如此

can [:update, :services], Service do |service|
  service.try(:user_id) == user.id
end

当您检查当前用户对服务的权限时,您需要将authorize!(:services, @user || User)更改为authorize!(:services, @services)