首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails-4设计+ CanCan不隐藏、编辑和销毁链接

Rails-4设计+ CanCan不隐藏、编辑和销毁链接
EN

Stack Overflow用户
提问于 2013-09-10 12:20:50
回答 2查看 547关注 0票数 1

我正在使用CanCan和Devise,但是通过自定义UsersController来管理devise用户。我只希望logged_in用户看到编辑销毁链接。但是现在取决于传递给能力类的内容,它要么为包括用户在内的所有用户隐藏编辑链接和破坏链接,要么将所有用户的编辑销毁链接公开给any signed_in user E 213,因此如果不是他们的,他们可以编辑任何用户帐户事件。

用户/index.html.erb

代码语言:javascript
复制
 <% @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 %>

能力课

代码语言:javascript
复制
 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 227E 128签名的代码>E 229用户可以编辑帐户E 130不属于E 231)公开销毁和编辑链接。在屏幕截图中,真正的signed_in用户的电子邮件是a@test.com,但您可以看到,他可以访问编辑和 access 链接,而不是signed_in,即b@test.com

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

用户控制器的缩短版本

代码语言:javascript
复制
  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

会话控制器

代码语言:javascript
复制
 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才能看到编辑和破坏链接。新的截图:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-10 12:27:45

尝试通过散列(而不是块) https://github.com/ryanb/cancan/wiki/Defining-Abilities#hash-of-conditions来定义能力

代码语言:javascript
复制
can :manage, User, :id => user.id
票数 1
EN

Stack Overflow用户

发布于 2013-09-10 12:27:12

在你的ability.rb里:你试过:

代码语言:javascript
复制
user ||= User.new # guest user
# you can here try some condition if you have multi user types
can [:new, :create], :all
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18718836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档