2016-03-04 20 views
0

這是我ability.rb是什麼樣子:如何讓我的ability.rb能夠正常工作以進行索引操作?

​​

在我的控制器我有這樣的:

class ConnectionsController < ApplicationController 
    load_and_authorize_resource 
    skip_authorize_resource only: :index 

    layout 'connections' 

    def index 
    @family_tree = current_user.family_tree 
    @inviter_connections = current_user.inviter_connections.order("updated_at desc") 
    @invited_connections = current_user.invited_connections.order("updated_at desc") 
    end 
end 

在我application_controller.rb,我有這樣的:

rescue_from CanCan::AccessDenied do |exception| 
    redirect_to authenticated_root_url, :alert => exception.message 
    end 

然而,當我嘗試訪問/connections當我沒有登錄,我得到這個錯誤:

NoMethodError at /connections 
undefined method `family_tree' for nil:NilClass 

此外,當我從我的ability.rb中刪除can :manage, Connection時,它實際上會將我發送到登錄頁面,就像我期望的那樣。

我該如何同時工作?

回答

0

嘗試以下操作:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 

    if user.has_role? :admin 
     can :manage, :all 
    else 
     can :manage, Connection, inviter_user_id: user.id 
    end 

    end 
end 

另外,注意到,你只是skip_authorize_resource:指數,嘗試註釋掉這一點,看看它是否工作。

+0

不可以。沒有這樣的運氣:( – marcamillion

+0

評論'skip_authorize_resource'不起作用:( – marcamillion

0

在您的控制器的第8行上,current_user在您未登錄時爲零,並且它的名稱爲family_tree

你需要的東西一樣(只是作爲一個例子,這取決於你的需求):

@family_tree = current_user.try(:family_tree) || FamilyTree.new 

它「作品」,當你刪除Ability行的原因是因爲,消除看能力連接,所以在你進入index之前before_filter重定向。什麼可能絆倒你是Connection記錄有inviter_user_idnilUser#idnil,所以它允許你進入index

+0

我知道這是問題的原因。問題是我如何獲得CanCanCan來幫助解決它。如果用戶沒有登錄,他們不應該能夠在'/ connections'處查看'Connection#Index'資源,所以我不想爲該頁面上的任何模型創建一個新對象,這取決於用戶是否是current_user。我只是想將它們重定向到適當的登錄頁面,但是,當它們已經登錄時,我想確保它們只能訪問與之相關的「Connection#Index」。我如何實現這兩個目標? – marcamillion

+0

在你的數據庫中是否有''Connection'',其中'inviter_user_id'爲零? – Woahdae

+0

Nope。[9] pry(main)> Connection.where(inviter_user_id:nil) 連接加載(0.9ms)SELECT「connections」。* FROM 「連接」WHERE「連接」。「inviter_user_id」是NULL => []' – marcamillion

1

看起來您正在使用Devise進行身份驗證。對於使用設計時的這種驗證,您應該將此添加到您的控制器:

before_action :authenticate_user! 
+0

好吧,這讓我到另一個錯誤,這是'ActiveRecord :: RecordNotFound在/用戶/登錄 無法找到用戶'id'= login'我如何定製這個重定向我也是?它將請求發送給'/ users/login',我希望它將它發送到'login_path'。我如何實現這一目標? – marcamillion

+0

我相信它更好地使用默認的設計路徑進行登錄,但您可以按照以下說明實現您想要的功能:https://github.com/plataformatec/devise/wiki/How-To:-Redirect-toa-a-特定頁面時,該用戶可任意未待驗證 – akz92