Rub*_*tic 4 ruby-on-rails devise cancan ruby-on-rails-3
你如何阻止其他用户编辑一个对象,比如一个不属于他们自己的个人资料对象呢?
大多数在线示例都是具有多个用户角色的复合体,我无法使其工作,但必须简单:
  def initialize(user)
      can :update, Profile do |profile|
        profile.try(:user) == current_user
      end
  end
在我的ProfilesController#edit中
authorize! :update, @profile
Lea*_*RoR 12
第一个问题是,你有没有为自己的角色做过User?
应用程序/模型/ user.rb
class User < ActiveRecord::Base
  attr_accessible :email, :password, :remember_me
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, # regular devise stuff
  before_create :setup_default_role_for_new_users
  ROLES = %w[admin default banned]
  private
  def setup_default_role_for_new_users
    if self.role.blank?
      self.role = "default"
    end
  end
end
正如您所看到的,我在这里有3个不同的角色,当创建新用户时,他们始终是default用户.现在有了CanCan设置,让我们说你想要admin能够做所有事情,default用户可以用他们自己的配置文件做所有事情,banned用户无法做任何事情,访客用户能够看到配置文件:
class Ability
  include CanCan::Ability
  # Remember that CanCan is for a resource, meaning it must have a class(model).
  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.role == "admin"
      can :manage, :all
    elsif user.role == "default"
      can :manage, Profile, :user_id => user.id
    elsif user.role == "banned"
      cannot :manage, :all
    else
      can :read, Profile # guest user
    end
  end
end
这就是你如何让用户只编辑他们自己的个人资料和没人.
其他一些方便的注意事项:确保表格中有一user_id列Profile.此外,如果您可能需要让猜测用户看到如下配置文件:
class ProfileController < ApplicationController
    before_filter :authenticate_user!, :except => :show
    load_and_authorize_resource
end
他们将无法使用任何其他操作,CanCan仍会检查除其他所有内容之外的身份验证show.
祝好运!
更新:制作:用户的角色属性
我所做的是运行一个迁移,将role列添加到Devise users表中:
rails generate migration add_role_to_users role:string
然后rake db:migrate.新的迁移文件应如下所示,并检查您的db/schema.rb文件,以确保正确区分其用户表.如果不是那么rake db:drop,rake db:create那么rake db:migrate又一次.
class AddRoleToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :role, :string
  end
  def self.down
    remove_column :users, :role
  end
end
这就是您成功完成user.role工作的方式.
注意:确保您保留该行:can :manage, Profile, :user_id => user.id没有任何更改.添加role列后应该可以正常工作user.
重要!如果您使用的Rails 3,DO NOT MAKE role attr_accessible或每个人都可以编辑自己的角色!Rails 4 默认使用强参数,不受此问题的影响,因为您可以选择允许的参数.
| 归档时间: | 
 | 
| 查看次数: | 4331 次 | 
| 最近记录: |