2015-11-04 36 views
1

我試圖從一個特定頁面 - 登錄頁面中排除控制器的操作。我希望代碼在其他頁面上執行。Ruby on Rails得到檢查我們在哪個頁面

在我的控制,我有:

def user_check 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 

    if (session[:user_id]) 
    @loginstatus = "You are logged in as: #{@current_user.name}" 
    elseif current_page?('/signin') == true 
    @loginstatus = "Please login to use this application" 
    else 
    redirect_to '/sessions/new', :error => "You are not logged in" 
    end 
end 

是給我找麻煩該生產線是

elseif current_page?('/signin') == true 

我與

<%= user_check %> 
調用這個在application.html.erb

當我這樣做,我得到

pp/views/layouts/application.html.erb其中第94行上升: 未定義的方法`current_page?'爲# Rails.root:C:/用戶/ cmendla/RubymineProjects /器Rl2

但是 - 如果我把一個XX.html.erb頁面之後,它工作正常。

<%= render(:partial => 'shared/alt_nav') if current_page?('/help') %> 

我不明白的是爲什麼current_page?檢查在頁面上工作,但在def中elseif內不起作用。

+2

Ruby沒有'elseif'。使用'elsif' –

回答

2

您的代碼效率不高 - 您正在驗證兩個完全(不相關)的條件集合 - 是否聲明變量以及用戶是否訪問頁面。

我會做到以下幾點:

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    before_filter :check_user 

    private 

    def check_user 
     @current_user ||= User.find(session[:user_id]) if session[:user_id] 

     if (session[:user_id]) 
      @loginstatus = "You are logged in as: #{@current_user.name}" 
     else 
      redirect_to '/sessions/new', :error => "You are not logged in" 
     end 
    end 
end 

#app/controllers/sessions_controller.rb 
class SessionsController < ApplicationController 
    skip_before_filter :check_user 
end 

這做了兩兩件事:

1)圍繞建立一個一套條件的條件邏輯。

2)它使你的邏輯行動導向

你擁有的主要問題是呼喚你current_page?在條件基本邏輯捆綁你的手非常緊密的針對應用程序的任何其他部分。 Rails應用程序是object orientated,並且預計會像這樣運行。

當您驗證用戶是否訪問了頁面時,您忽略了一個事實,即在您的開發後期,該「頁面」可能會/意味着完全不同的內容。更何況你可能希望擴展你的功能超出該頁面(關於「註冊」等?)。

這意味着,當調用條件邏輯爲你,你最好保持它,基於動作用戶正在執行基準面簡單(是他們登錄?),和過濾。

例如...

#app/controllers/sessions_controller.rb 
class SessionsController < ApplicationController 
    skip_before_filter :check_user, except: :destroy #-> doesn't check user login for user login/registration; does for logout 
end 

希望這有助於。

0

將登錄頁面移動到其他控制器(另一個視圖子目錄),也要更改路由。這將是最乾淨的。

如果您希望所有受保護的頁面都調用user_check,最簡單的方法是將您的登錄掛載到/ unsecure/signon路由,映射到unsecure_controller.rb,並且不會調用user_check。