2011-06-12 6 views
6

나는 cancan 보석을 사용하는 것에 관한 railscast를 지나고 있었다. 그러나 단지 사용자가 그 자신의 쇼 페이지를 구경하는 것을 허락하는 방법에 붙이게된다. 단지 그들의 자신의 리뷰를 업데이트 할 수 있습니다사용자가 cancan을 사용하여 자신의 쇼 페이지 만 방문하도록 허용하려면 어떻게해야합니까?

능력 모델

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.role == "admin" 
     can :manage, :all 
    else 
     can :read, :all 
     if user.role == "author" 
     can :create, Review 
     can :update, Review do |review| 
      review.try(:user) == user 
     end 
     can :update, User do |user| 
      user.try(:current_user) == current_user 
     end 
     end 
     if user.role == "owner" 
     can :update, Venue 
     end 
    end 
    end 
end 

사용자 컨트롤러

class UsersController < ApplicationController 
    load_and_authorize_resource 
end 

사용자 (저자) 만 할 수 있습니다

내 코드는 다음과 같습니다 현재 URL을 변경하여 모든 사용자에게 페이지를 표시합니다.

무엇이 여기에 있습니까?

대단히 감사합니다. 도움에 감사드립니다.

+1

문제는'can : read, : all' 행에 있습니다. 모든 사용자가 모든 페이지를 볼 수 있도록 허용했습니다. – mirelon

답변

10

제한은 능력 클래스에서 바로 전달할 수 있으며, 시도하는 방식보다 훨씬 쉽습니다. 나는 이것이 당신이 가지고있는 능력을 놓치고 있다고 확신하지만 이것은 시작해야합니다. 리뷰 :belong_to 외래 키가 :user_id 인 사용자. Venues에 대해 비슷한 종류의 제약이 필요한 것처럼 보이지만 코드에 포함시키지 않았으므로 여기에 넣지 않았습니다.

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.role == "admin" 
     can :manage, :all 
    elsif user.role == "author" 
     can :create, Review 
     can :update, Review, :user_id => user.id 
     can [:show, :update], User, :id => user.id 
    elsif user.role == "owner" 
     can :update, Venue 
     can [:show, :update], User, :id => user.id 
    else 
     can [:show, :update], User, :id => user.id 
    end 
    end 
end 
0

/show에 대한 요청이 들어올 때 제어기의 체크를 추가하여 current_user가 페이지/프로필의 소유자인지 확인하십시오. 의 라인을 따라 뭔가 :

def show 
    @user = User.find(params[:id]) 
    #show_page unless current_user.id != @user.id 
end 

아마 또는 실패에 비슷한 "당신은 해당 페이지를 보유하고 있지 않습니다"라는 통지를 깜박입니다.

+0

그렇게 할 필요가 없습니다. CanCan이 당신을 위해이 모든 것을 할 수 있습니다. – mirelon

관련 문제