2012-03-21 28 views
2

我以爲方法,如名稱和電子郵件默認在rails?爲什麼我得到錯誤未定義的方法名稱爲nil:NilClass與Ruby on Rails?

在我的靜態頁面查看,在profile.html.erb我:

<% if logged_in? %> 
<% provide(:title, @user.name) %> 
<% else %> 
<% provide(:title, 'Profile')%> 
<% end %> 

我把我的static_page_controller

def profile 
    @user = User.find_by_remember_token(:remember_token) 
end 

當我去到控制檯User.find_by_remember_token(「actualtoken 「).name返回適當的用戶名,但:remember_token不。我該如何製作:remember_token =登錄的用戶記憶令牌?

在我sessions_helper我有

def log_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    current_user = user 
    end 

    def logged_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
     @current_user ||= user_from_remember_token 
    end 

    def log_out 
    current_user = nil 
    cookies.delete(:remember_token) 
    end 


    private 

    def user_from_remember_token 
     remember_token = cookies[:remember_token] 
     User.find_by_remember_token(remember_token) unless remember_token.nil? 
    end 
end 

將其複製到我的static_pages_helper沒有完成任何事情。

回答

2

快速事物的會議助手,你應該知道Rails框架和Ruby語言:

  • 一在你的任何助手中定義的函數將可用於所有助手和視圖(因此沒有理由通過不同的助手複製和粘貼相同的函數);
  • 您可能正在使用身份驗證寶石,我想這是Devise的寶石。如果這是對的,那麼除非你有理由這樣做,否則你不應該凌駕他們的助手。
  • User.anything將從User類調用靜態函數什麼;
  • user = User.find_by_anything(the_thing)是由ActiveModel提供的一個類的靜態幫助器,它將查詢數據庫以查找具有* anything = the_thing *的用戶;這個用戶或零將返回;
  • user.an_attribute將調用一個函數,該函數返回用戶指定的屬性(默認情況下該屬性與該屬性的列名相同);
  • user.try(:anything)將嘗試從用戶調用該函數並返回其值。如果用戶爲零,則返回的值也將爲零。

這麼說,我想你只是想檢索當前用戶記住令牌,該令牌可實現如下:

user = current_user.try(:remember_token) 

編輯:的問題是有點亂,但我也認爲以下代碼將與您的控制器配合使用:

def profile 
    @user = User.find_by_remember_token(params[:remember_token]) 
end 

您必須通過params散列來訪問請求的參數。

+0

感謝所有有用的信息。我不得不用cookies替換params:User.find_by_remember_token(params [:remember_token]),解決了錯誤謝謝。 – Laser 2012-03-22 01:45:45

1

編輯:完全取代我的一個希望不是愚蠢:-)第一個答案

(雖然有實施和管理中的Rails會議幾種方式,則默認使用Cookie在瀏覽器中引用的關鍵存儲在內存中,會話是通過瀏覽器的請求創建的,所以儘管使用控制檯可以訪問現有的會話,但它可能不是您想要的。)

因此,您的方法user_from_remember_token將返回一個用戶或零。我在代碼中看不到的地方是設置用戶模型中的remember_token。我假設它在那裏,但是如果你沒有找到它們,你可能想要有代碼告訴用戶登錄。常見模式是

def current_user 
    @current_user ||= user_from remember_token 
    unless @current_user 
    flash[:notice] = "Yo! Log in first." 
    redirect_to login_path and return 
    end 
end 

從單獨的控制器調用模型發現器沒有任何問題。但爲什麼打電話User.find_by_remember_token(:remember_token) - 你還沒有remember_token呢(對吧?)。你不是隻想在你的會話助手中調用current_user方法嗎?

如果該方法是不可見的,你可能要包括或要求您application_controller.rb

+0

噢,我有一個叫做user.rb的用戶名爲attr_accessible的模型:name,:email等。我是否還需要創建一個static_pages.rb模型? – Laser 2012-03-21 19:33:44

+0

哦,geez,完全是我的壞 - 我想我幾乎沒有閱讀你的帖子......不知道我錯過了它怎麼樣!我會編輯我的答案。對不起,關於。 – 2012-03-21 19:37:32

+0

哈哈k,謝謝。 – Laser 2012-03-21 19:40:58

相關問題