我正在使用CanCan和Devise,但是通过自定义UsersController来管理devise用户。我只希望logged_in用户看到编辑和销毁链接。但是现在取决于传递给能力类的内容,它要么为包括用户在内的所有用户隐藏编辑链接和破坏链接,要么将所有用户的编辑和销毁链接公开给any signed_in user E 213,因此如果不是他们的,他们可以编辑任何用户帐户事件。
用户/index.html.erb
<% @users.each do |user| %>
<div class="col-lg-3 col-sm-4 col-6">
<div><%= user.email %></div>
<% if user_signed_in? %>
<% if can? :update, user %>
<div class=" btn "><%= link_to "Edit", edit_user_path(user) %> </div>
<% end %>
<% if can? :destroy, user %>
<div class="btn btn-danger"><%= link_to 'Remove', user, method: :delete, data: {confirmation: 'Are you sure'} %></div>
<% end %>
<div><%= link_to "Sign Out", destroy_user_session_path, method: :delete %> </div>
<% end %> <!-- closes user_signed_in? -->
</div>
<% end %>能力课
class Ability
include CanCan::Ability
def initialize(user)
#to ensure user object is not nil when no user object is passed in
user ||= User.new
can :manage, User do |user|
#this exposes the destroy and edit links for all users including users not yet signed_in
#user.id == user.id
#this hide the destroy and edit links for all users including signed_in user
user == :user_id
end
end
end请注意,我在第二个屏幕截图下面添加了用户控制器
屏幕截图1显示,如果未注释user.id == user.id中的能力类,则会为所有用户(包括尚未签名的用户E 227和E 128签名的代码>E 229用户可以编辑帐户E 130不属于E 231)公开销毁和编辑链接。在屏幕截图中,真正的signed_in用户的电子邮件是a@test.com,但您可以看到,他可以访问编辑和 access 链接,而不是signed_in,即b@test.com

屏幕截图2,是当我们取消能力类中的用户== :user_id注释时得到的结果。编辑和销毁链接甚至对signed_in用户都是隐藏的。

用户控制器的缩短版本
class UsersController < ApplicationController
before_action :set_user, only: [:show, :update, :destroy]
before_filter :authenticate_user!, except: [:new, :create]
load_and_authorize_resource , only: [:index, :edit, :destroy]
respond_to :html, :json
def index
@users = User.all
respond_with @users
end
def edit
#@user = User.find(params[:id])
#respond_with @user
end
def destroy
@user.destroy
redirect_to users_path, {notice: 'A user was removed'}
end
private
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:email, :password, :password_confirmation)
end
end会话控制器
class UsersSessionsController < Devise::SessionsController
respond_to :html, :json
def create
super
if signed_in?(resource)
#call the code to transfer guest cart to signed_in user
load_current_cart
end
end
end由@gotva下面的回答所修正。因此,使用:**can :manage,User,:id => user.id --只有logged_in用户的a@test.com才能看到编辑和破坏链接。新的截图:

发布于 2013-09-10 12:27:45
尝试通过散列(而不是块) https://github.com/ryanb/cancan/wiki/Defining-Abilities#hash-of-conditions来定义能力
can :manage, User, :id => user.id发布于 2013-09-10 12:27:12
在你的ability.rb里:你试过:
user ||= User.new # guest user
# you can here try some condition if you have multi user types
can [:new, :create], :allhttps://stackoverflow.com/questions/18718836
复制相似问题