2013-03-06 157 views
0

我一直在努力,現在幾個小時做到這一點。我對Ruby和Rails很新。Ruby on Rails的定義變量

在devise.html.erb文件我有

<div class="container"> 
<%= render :partial => 'layouts/header' if user_signed_in? %> 
</div> 

以上優良工程。如果用戶已登錄,那麼他們能看到標題我的頁面的頂部, 如果他們沒有登錄,他們沒有看到它。

但我需要(因爲用戶必須把地址中的下頁):

<div class="container"> 
<%= render :partial => 'layouts/header' if current_user.registration_complete? %> 

當我重新啓動我的程序,我得到的錯誤信息:

NoMethodError in Devise/registrations#new 

我已經registration_complete在我的項目在其他地方定義,在user.rb(其中我的項目的其他部分有就認出)爲:

#Determines whether user completed his profile on registration or not 
def registration_complete? 
self.address.present? 
end 

有沒有別的地方我應該把這個代碼,因此它會在我的devise.html.erb的認可?

+1

給我們NoMethodError的完整錯誤。就像這樣,我們看不到它來自哪裏(儘管我假設它來自'registration_complete?'的調用?' – Jesper 2013-03-06 15:03:15

+0

'NoMethodError' ...什麼?沒有可用的方法?(我猜它抱怨'current_user') – Chowlett 2013-03-06 15:03:30

回答

2

NoMethodError in Devise/registrations#new是因爲 -

考慮一下:

<div class="container"> 
<%= render :partial => 'layouts/header' if current_user.registration_complete? %> 

在上面的代碼中current_usernil因爲註冊頁面的用戶沒有登錄

所以registration_complete沒有一種方法。爲零。

你也可以在你的代碼通過檢查該current_user出現在世界各地;

if current_user 
#User is logged in 
    <div class="container"> 
    <%= render :partial => 'layouts/header' if current_user.registration_complete? %> 
else 
#User is not logged in 
#Don't try current_user.registration_complete? check here..it will give error. 
end 

所以,你可以把包含current_user.registration_complete?檢查應用程序中的任何地方提供的代碼,您在登錄

0

什麼:

<%= render :partial => 'layouts/header' if current_user && current_user.registration_complete? %> 
0

由於SAURABH耆那已經指出的那樣,你的CURRENT_USER有時候會是零,所以你必須以某種方式處理。

他的if語句爲current_user是把它處理好辦法。

構建這個的另一種方法是將所有邏輯都確定爲用戶是將頭部看成輔助方法,還是更好地將其視爲演示者(例如,參見draper)。

在控制器中,我也將確保在這裏始終是一個用戶對象存在。如果沒有用戶登錄,我將創建一個新的用戶對象作爲虛擬。這樣就不會有那麼討厭的無問題了。

例如:

# In your controller 
@user = current_user || User.new 

# In a helper 
def can_see_header? (user) 
    user_signed_in? and user.registration_complete? 
end 

# In view 
<div class="container"> 
    <% if can_see_header? @user %> 
    <%= render "layouts/header" %> 
    <% end %> 
</div> 

在渲染調用的:partial鍵,當你想通過其他選項,至少在以後的版本電源軌的時候才需要。

0

感謝您的幫助,每一個。如果沒有像Stackoverflow這樣的網站,我會迷路!

最後,我使用了Adbeel和Jesper的解決方案的組合,這似乎可以完成這項工作。

我用:

<div class="container"> 
<%= render :partial => 'layouts/header' if user_signed_in? && current_user.registration_complete?%> 
</div> 

正如我所說的,它工作得很好,但如果你認爲有一些災難潛伏未來我不知道,我會很感激,如果你讓我知道!再次感謝。

Christophe。