【问题标题】:rails cancan allow users to edit *only* their data, but view everyonesrails cancan允许用户编辑*仅*他们的数据,但查看每个人
【发布时间】:2015-11-06 23:56:34
【问题描述】:

我有一个使用 Devise 和 cancan 的 rails 应用程序。我希望只允许用户编辑他们自己的数据,但仍然可以查看其他所有人。

我有:

class Ability
  include CanCan::Ability

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

    if user.role == "member"
    their own only
    can :read, User
    can :manage, User, user_id: user.id
  elsif user.role == "guest"

    can :read, User
  end

我也有:

class User < ActiveRecord::Base
  #attr_accessible :name , :email # Include default devise modules. Others available are:

  # Include default devise modules. Others available are:
  # :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

但我仍然可以编辑和删除其他用户的 cmets。当我不应该做的时候。为什么?我究竟做错了什么? 导轨 4 设计 2.5.2 康康1.6

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 devise cancan


    【解决方案1】:

    为了授予用户编辑自己数据的权限,更改

    来自

    can :manage, User, user_id: user.id
    

    到

    can :update, User
    

    【讨论】:

      【解决方案2】:

      您将 user_id 指定为用户模型的列名:

      can :manage, User, user_id: user.id
      

      我敢打赌,用户没有user_id 列——它只有一个id 列。你想要的是这样的:

      can :manage, User, id: user.id
      

      通过查看您的 schema.rb 文件并确保存在(或不存在)user_id 列来仔细检查。实际的 ID 列称为id,并未列在schema.rb 中,但实际上存在于数据库表中。

      另外,请确保您确实想要允许 :manage 权限。 :manage 符号非常强大,允许用户对相关对象执行任何操作,包括删除它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 2023-04-10
        • 1970-01-01
        • 2018-05-12
        相关资源
        最近更新 更多