Cancan,允许用户只查看或编辑自己的内容

时间:2014-11-08 00:42:16

标签: ruby-on-rails devise permissions cancan

我正在使用Rails设置一个非常基本的Web应用程序,我已经设置好了设置和工作。

我现在的问题是,无论我是谁登录,因为我可以查看和销毁我上次登录的帐户内容。

我只需要两种类型的角色,成员和来宾。会员应该只能查看,编辑和销毁他们自己的内容,而且客人应该只能盯着注册屏幕。

有人可以帮帮我吗?我已经安装了cancan并拥有了能力文件夹。

我从本网站上的其他几个问题中复制了一些设置,到目前为止还没有任何设置,这是我当前的用户.rb

class User < ActiveRecord::Base
  attr_accessible :name , :email # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

     ROLES = %w[member guest]


  def is?( requested_role )
    self.role == requested_role.to_s
  end
end

和我目前的能力

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    if user.role == "member"
      can :manage, :user_id => user.id
    elsif user.role == "guest"
      cannot :manage, :all, 
  end
end

2 个答案:

答案 0 :(得分:1)

  ability.rb

中的

user ||= User.new # guest user (not logged in)

  # admin
  if user.has_role? :admin
    can :manage, :all

  # member
  elsif user.has_role? :member
    can :manage, User, id: user.id
    cannot :index, User

  # guest
  else
    cannot :manage, User
  end

并且不要忘记在load_and_authorize_resource行之后将before_action包含在用户控制器的开头。例如,像这样

enter image description here

  

证明:这绝对有效

用户尝试获取其他用户的详细信息,结果401

enter image description here

用户试图获取自己的详细信息,结果为200

enter image description here

用户尝试阅读所有用户,结果401

enter image description here

  

为什么:manage, User, user_id: user.id无法工作?

Bcoz搜索users.user_id肯定不存在

enter image description here

答案 1 :(得分:0)

嗯。看起来您的语法可能有点偏差:

if user.role == "member"
  can :manage, User, :user_id => user.id
elsif user.role == "guest"
  cannot :manage, User, :all
end

确保将模型(用户)作为第二个属性传递给cancannot方法。