2011-06-12 35 views
6

我一直在使用康康寶石的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 

用戶(作者)只能更新thier自己的意見,但能目前通過更改URL來查看所有用戶顯示頁面。

我在這裏錯過了什麼?

非常感謝任何幫助,非常感謝!

+1

問題出在'can:read,:all'這一行。您允許查看所有用戶的所有頁面。 – mirelon 2014-11-13 13:28:18

回答

10

約束可以在你的能力課中正確傳遞,甚至比你嘗試的方式更容易。我相信這是缺少你想要的一些能力,但這應該讓你開始。我假設評論:belong_to外鍵爲:user_id的用戶。它看起來像你需要一些類似的場地約束,但你沒有在你的代碼中,所以我沒有把它放在這裏。

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 2014-11-13 13:25:46

相關問題