1

私はいくつかのカスタム レーキ ルートを持っており、自分のアカウントの現在のユーザー編集ページのみを許可する目的で 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 に答える