2015-01-12 4 views
0

각 사용자가 자신의 logg 만 생성, 읽기, 업데이트 및 삭제할 수 있도록 각 사용자를 인증하려고 시도합니다. 비계를 사용하여 로그를 만들었습니다. 나는 devise와 admin을 사용자의 불린으로 사용했다. LoggsController, User 모델, 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

왜이 코드를 사용해보십시오 : ability.rb에서이 코드를 바꿀 수 있습니다'can : update, Logg do | logg | logg.try (: user) == 사용자 end'이 'can : update, user_id : user.id'입니다. 나는 그 사용자가 has_many loggs라고 가정하고있다 –

+0

사용자가 loggs 컨트롤러에 user_id를 추가하고 추가하여 자신의 loggs 만 관리 할 수 ​​있도록 문제를 해결했다. 그렇지 않으면 can : manage, Logg, : user_id => user.id하지만 여전히 색인 페이지에서 다른 로그를 볼 수 있으며 표시, 수정, 삭제 링크가 계속 표시됩니다. 나는 cancan 방법을 시도해 <% if can? : 생성, 로그 %> <% = link_to '새 로그', new_logg_path %> <% end %> – Mo2

답변

0

아무 곳 Logg의 소유자 (사용자)를 설정하는 것이 보이지 않는다. 작성시 다음과 같은 것이 필요합니다 :

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