2016-01-11 54 views
0

拋出一個沒有方法的錯誤,我的用戶模型做了一個主持人的方法,多數民衆贊成定義上CURRENT_USER的方法沒有它在非登錄用戶

def mod_of_game?(guide_id) 
    game_mods_relationships.exists?(game_category_id: guide_id) 
    end 

問題是,只要用戶沒有登錄它只是在頁面上拋出無方法錯誤。

我會在將來製作更多的用戶方法,我只能假設我每次都會遇到這個問題。

我還沒有嘗試過,但我想我可以把一個if else語句的方法

def mod_of_game?(guide_id) 
    if current_user.nil? 
    #empty method 
    else 
    game_mods_relationships.exists?(game_category_id: guide_id) 
    end 

但我覺得還有的是我不知道的更有效的方式。我正在構建一個應用程序來更好地學習rails,所以我猜這是我不知道的事情之一。

回答

2

的問題是,如果沒有用戶登錄,current_usernil,而不是User類的一個實例。因此,無法在用戶模型中修復此問題,因爲如果它是nilcurrent_user不是User。另外,current_user通常在模型中不可用,只是在控制器和視圖中。

我會推薦的是在控制器中添加一個過濾器,以確保如果沒有用戶登錄,訪問者將被重定向到登錄頁面。這可以通過在控制器中的before_action過濾器來完成,像這樣:

class YourController < ApplicationController 
    before_filter :authenticate_user! 

    ... 
end 

否則,您可以隨時檢查是否current_user是調用nil以前.mod_of_game?,就像這樣:

current_user.mod_of_game?(@guide) unless current_user.nil? 
+0

在這種情況下,我不能在過濾器之前使用。如果current_user是一個mod,則在控制器方法內部的if語句中調用該方法以向db表中添加額外信息。 – Rob

+1

然後我提出的另一個建議('current_user.mod_of_game?(@ guide),除非current_user.nil?')應該可以工作。 – taglia

+0

所以基本上這個調用變成了'nil.mod_of_game?當用戶沒有登錄時,@ guide'?並且該方法不在nil中,所以不管用戶模型中的方法對於未登錄的用戶都無效。 – Rob

1

嘗試以下操作:

# It will return `nil` if user is not logged in 
def mod_of_game?(guide_id) 
    game_mods_relationships.exists?(game_category_id: guide_id) if current_user 
end 
+0

由於該方法位於用戶模型內部,因此不會起作用,因此它將永遠不會被調用。 – taglia

0

你的模式是錯誤。


調用mod_of_game?instance method,這意味着它有上User一個實例被調用。

由於current_user的性質,您將無法調用此方法,除非用戶登錄或至少調用了

您必須先使用前端的所有條件才能確定current_user是否存在,然後在其上調用mod_of_game? ...

<% if user_signed_in? && current_user.mod_of_game?(@guide) %> 

-

一個更好的方法是創建自己的幫手方法,或者使用.try方法:

#app/helpers/application_helper.rb 
class ApplicationHelper 
    def mod? guide 
     return false unless current_user 
     current_user.mod_of_game? guide 
    end 
end 

這將允許你打電話:

<% if mod? @guide %> 

...將返回false如果用戶未登錄,或用戶不是mod。


原因的模式是不好的,因爲你不必基座邏輯兩個條件:user signed in?are they a mod?

你想要的是一個單點的邏輯,這將返回true或false:

<% if current_user.try(:mod_of_game?, @guide) %> 
相關問題