我有一些自定义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/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
答案 0 :(得分:2)
您需要在Ability.rb中定义权限,如此
can [:update, :services], Service do |service|
service.try(:user_id) == user.id
end
当您检查当前用户对服务的权限时,您需要将authorize!(:services, @user || User)
更改为authorize!(:services, @services)