2015-01-12 69 views
0

我试图授权每个用户,以便他们可以创建,读取,更新和销毁他们自己的logg。我使用脚手架创建了logg。我在用户中使用了devise和admin作为布尔值。我有一个LoggsController,用户模型,logg模型和ability.rb我试图跟踪投射视频,以便我可以让所有用户都这样做。到目前为止,管理员可以做所有事情。但用户不能做我想要的。cancan授权

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 %> 
+0

'admin?'的定义是什么? – kasperite

+0

你为什么不试试这个:在capability.rb中替换这个代码'可以:update,Logg do | logg | logg.try(:user)== user end' for this'can:update,user_id:user.id'。我假设用户has_many loggs –

+0

我修复了这个问题,以便用户只能通过在loggs控制器中添加user_id并添加来管理他们自己的loggs。 else can:manage,Logg,:user_id => user.id但他们仍然可以查看索引页面中的其他loggs,并且显示,编辑,销毁链接仍然可见。我尝试了cancan方式添加<%如果可以? :创建,Logg%> <%= link_to'New Logg',new_logg_path%> <% end %>但这不工作 – Mo2

回答

0

它看起来并不像你在任何地方设置LOGG的所有者(用户)。在你创建时,你需要这样的东西:

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