Ruby on rails 坎坎授权
我试图授权每个用户,以便他们可以创建,读取,更新和销毁只有他们自己的日志。我使用脚手架创建了日志。我在用户中使用了designe和admin作为布尔值。我有一个LoggsController、用户模型、logg模型和能力。rb我试着跟随rails播放的视频,以便允许所有用户都这样做。到目前为止,管理员可以做任何事情。但是用户不能做我想让他们做的事Ruby on rails 坎坎授权,ruby-on-rails,model,devise,controller,cancan,Ruby On Rails,Model,Devise,Controller,Cancan,我试图授权每个用户,以便他们可以创建,读取,更新和销毁只有他们自己的日志。我使用脚手架创建了日志。我在用户中使用了designe和admin作为布尔值。我有一个LoggsController、用户模型、logg模型和能力。rb我试着跟随rails播放的视频,以便允许所有用户都这样做。到目前为止,管理员可以做任何事情。但是用户不能做我想让他们做的事 class Ability include CanCan::Ability def initialize(user) user||=
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
看法
看起来您并没有在任何地方设置日志的所有者用户。在创建中,您将需要以下内容:
def create
@logg = current_user.loggs.create(logg_params)
respond_with(@logg)
end
admin的定义是什么?为什么不试试这个:在ability.rb can:update,Logg do | Logg | Logg.try:user==用户端对于这个can:update,user|id:user.id。我假设用户有很多日志我修复了这个问题,这样用户就可以通过在loggs控制器中添加一个用户id并添加日志来管理自己的日志。其他人可以:manage、Logg、:user_id=>user.id,但他们仍然可以在索引页中查看其他日志,并且显示、编辑和销毁链接仍然可见。我试着用cancan的方法来添加,但也不起作用
def create
@logg = current_user.loggs.create(logg_params)
respond_with(@logg)
end