【问题标题】:Authorization with cancancancan 授权
【发布时间】:2015-01-12 00:11:51
【问题描述】:

我正在尝试授权每个用户,以便他们只能创建、读取、更新和销毁自己的日志。我使用脚手架创建了日志。我在用户中使用了设计和管理作为布尔值。我有一个 LoggsController、用户模型、日志模型和能力。我尝试按照 rails cast 视频进行操作,以便我可以允许所有用户执行此操作。到目前为止,管理员可以做任何事情。但是用户不能做我想让他们做的事。

class Ability
  include CanCan::Ability

  def initialize(user)
    user||= User.new 

    if user.admin?
      can :manage, :all
    else
      can :read, :all 
      can :create, Logg
      can :update, Logg do |logg|
        logg.try(:user) == user
      end
    end
  end
end

我的模型和控制器

class User < ActiveRecord::Base
  ROLES = %w[admin moderator author banned]

  has_many :loggs

  def role?(role)
    roles.include? role.to_s
  end
end

class Logg < ActiveRecord::Base
  belongs_to :users
end

class LoggsController < ApplicationController
  load_and_authorize_resource
  before_action :set_logg, only: [:show, :edit, :update, :destroy]

  respond_to :html

  def index
    @loggs = Logg.all
    respond_with(@loggs)
  end

  def show
    respond_with(@logg)
  end

  def new
    respond_with(@logg)
  end

  def edit
  end

  def create 
    @logg.save
    respond_with(@logg)
  end

  def update
    @logg.update(logg_params)
    respond_with(@logg)
  end

  def destroy
    @logg.destroy
    respond_with(@logg)
  end

  private
  def set_logg
    @logg = Logg.find(params[:id])
  end

  def logg_params
    params.require(:logg).permit(:name, :date, :time, :whats_gone_well_this_week,    :whats_not_gone_well_this_week, :learnt_anything_new, :what_would_you_like_to_improve, :anything_else)
  end
end

查看

<% if can? :show, @logg %>
  <%= link_to 'Show', logg %>
<% end %>
<% if can? :update, @logg %>
  | <%= link_to 'Edit', edit_logg_path(logg) %>  
<% end %>
<% if can? :destroy, @logg %>
  | <%= link_to 'Destroy', logg, method: :delete, data: { confirm: 'Are you sure?' } %></p>
<% end %>

【问题讨论】:

  • admin?的定义是什么?
  • 你为什么不试试这个:将ability.rb can :update, Logg do |logg| logg.try(:user) == user end中的这段代码替换为can :update, user_id: user.id。我假设用户 has_many 日志
  • 我修复了这个问题,以便用户可以通过在日志控制器中添加 user_id 并添加来仅管理自己的日志。 else 可以 :manage, Logg, :user_id => user.id 但他们仍然可以在索引页面中查看其他日志,并且显示、编辑、销毁链接仍然可见。我尝试了 cancan 的方式来添加 但这也不起作用

标签: ruby-on-rails model devise controller cancan


【解决方案1】:

您似乎没有在任何地方设置 Logg 的所有者(用户)。在您的创建中,您需要以下内容:

def create
  @logg = current_user.loggs.create(logg_params)
  respond_with(@logg)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    相关资源
    最近更新 更多