2008-11-18 76 views
1

我不明白爲什麼一個方法會工作,而另一個會拋出一個NoMethodError,如果他們來自同一個lib文件。restful_authentication:授權? = NoMethodError(但logged_in?工作正常......?)

# app/views/bunnies/show.html.erb 
<% if logged_in? %> 
    <%= current_user.login %> | 
    <%= link_to 'Logout', logout_path %> | 
    <% if authorized? %> 
    <%= link_to 'Edit Details', edit_bunny_path(@broker) %> | 
    <% end %> 
    <%= link_to 'Back', bunnies_path %> 
<% end %> 

...爲authorized?引發NoMethodError。如果我評論說如果屏蔽,頁面可以正常工作(logged_位於?)。

# lib/authenticated_system.rb 
def logged_in? 
    !!current_user 
end 

def authorized? 
    current_user.login == "admin" 
end 

# app/controllers/application.rb 
class ApplicationController < ActionController::Base 
    include AuthenticatedSystem 
end 

什麼給?

+0

你是壓倒一切的 「授權?」在應用程序/控制器/ application.rb?或者你修改/lib/authenticated_system.rb? – csexton 2008-11-18 18:10:44

+0

我只修改/lib/authenticated_system.rb每個提供的例子。上面的行是我在application.rb中插入的這個插件的唯一行。 – neezer 2008-11-18 18:45:13

回答

0

對,所以我仍然不明白爲什麼這不起作用,但我找到了替代解決方案。

(1)保持authenticated_system.rb不變。

(2)一個輔助方法添加到控制器/ application.rb中:

helper_method :is_admin? 
def is_admin? 
    if logged_in? && current_user.login == "admin" 
    true 
    else 
    false 
    end 
end 

(3)使用輔助方法代替authorized?。如果有人想解釋爲什麼原始代碼無法正常工作,我全都是耳朵!

(感謝this post

2

我猜你是不是在引發錯誤登錄。 NoMethod不是指#authorized ?.它實際上是指current_user的#login方法。如果你沒有登錄,那麼當current_user.login在#authorized?中被調用時,current_user是零,導致NoMethod。

任何助手像授權?檢查用戶狀態應該包括檢查logged_in?首先繞過這個問題。試試這個...

def authorized? 
    logged_in? and current_user.login == "admin" 
end 

你反彈出條件,如果沒有登錄,這樣一來,你不嘗試訪問#login方法,除非你確實有可用的對象。

您也可以查看一些可用於Restful_Authentication的基於角色的身份驗證方案。如果您的訪問模式將比僅僅檢查管理員更復雜,那麼使用其中一個插件會更容易。

順便說一句,在authenticated_system.rb越往下,你會發現這樣的代碼:

# Inclusion hook to make #current_user and #logged_in? 
# available as ActionView helper methods. 
def self.included(base) 
    base.send :helper_method, :current_user, :logged_in?, :authorized? if base.respond_to? :helper_method 
end 

這是什麼使這個方法可用模塊中的意見輔助方法淺析。如果向authenticated_system.rb添加一個返回用戶狀態的方法(例如類似#superuser?的方法),則需要在該代碼中將該方法符號添加到base.send調用中。再次,如果你發現自己編寫了很多訪問控制代碼,學習其中一個插件將是有序的。

1
def is_admin? 
    logged_in? && current_user.login == "admin" 
end 

足夠

相關問題