0

我試圖根據登錄狀態創建一個行爲不同的頁面。 例如,如果用戶試圖導航到另一個頁面,它應該打開一個要求註冊的對話框,而如果用戶已經登錄,他/她將只是瀏覽而不會有問題。在不重定向的情況下檢查Rails Devise中的sign_in狀態

我試圖用這樣的:當點擊$("registration_modal")當一個jQuery的處理開闢了一個模式

<% if current_user %> 
    <%= link_to @post %> 
<% else %> 
    <a href = '#' id = 'registration_modal'><a> 
<% end %> 

但是爲了做到這一點,我需要在控制器內部調用authenticate_user!。但是,如果我這樣做,它只會重定向用戶登錄頁面,而不是渲染此頁面。

我想知道是否有一種簡單的方法來處理這種情況。謝謝!

+0

你是說他們不需要爲顯示上面的頁面的當前控制器進行認證?如果是這樣,那麼你不需要在該控制器中調用'authenticate_user!'。無論您是否在相關控制器中調用'authenticate_user!',''current_user''或'signed_in?'都可以工作。你需要通過'link_to @ post'鏈接的控制器'authenticate_user!'。或者你需要在當前控制器上使用'authenticate_user!'嗎?也許你可以跳過它顯示你的網頁的行動? – Tim

+0

謝謝我認爲我必須authenticate_user!所有的時間,但事實證明,它不是。如果你想要,你可以在下面寫同樣的東西,我會接受它作爲答案。但不管,謝謝! – Vlad

回答

1

正如我們在上面的評論中所討論的,解決方法是不要在控制器上調用authenticate_user!,該控制器顯示您在代碼中粘貼問題的視圖。然後用戶不會立即重定向到登錄頁面。無論您是否在控制器中調用authenticate_user!current_useruser_signed_in?都能正常工作,因此視圖將正常工作。相反,您可以在link_to @post轉到的控制器上調用authenticate_user!,以確保那個控制器在登錄後受到保護。

如果您只想確保控制器中某些操作需要登錄,則始終可以使用過濾器的標準參數:except:only。例如:

before_filter authenticate_user!, :except => [:an_action, :another_one] 

我寧願:except:only在這種情況下,因爲它有效的白名單不需要身份驗證方法,因此任何新的添加需要身份驗證,除非他們被添加到列表中,而:only意味着新方法不需要認證,除非您將它們添加到列表中。所以:except默認情況下更安全,這總是很好!在這個主題上,如果你想在整個應用程序中默認安全,你可以進一步添加一個before_filter authenticate_user!到你的ApplicationController,然後你不想在你的子控制器中進行身份驗證,你可以使用skip_before_filter :authenticate_user!, :only => [:an_action, :another_one]。如果使用Rails 4,它是before_actionskip_before_action

相關問題