2011-06-12 30 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

相关问题