1

我有一些自定义 rake 路线,我正在尝试使用 CanCan 仅允许当前用户编辑他们自己帐户的页面。我的 URL 示例是 ->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/edit, users/2/services/edit, users/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
4

1 回答 1

2

您需要像这样在 Ability.rb 中定义权限

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

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

于 2013-07-12T06:05:22.180 回答