2012-10-27 30 views
0

我試圖實現一個登錄表單,但我的路由似乎是錯誤的。 當身份驗證失敗時,應用程序將重定向到subdomain.domain.com/login,但它只應該再次呈現登錄頁面(只有不帶「/ login」的subdomain.domain.com)。Rails:登錄表單的正確路由

視圖/登錄/ index.html中

<%= form_tag(check_login_path, :method => "post") do %> 
    ... form fields 
<% end %> 

的routes.rb

constraints(Subdomain) do 
    match '/' => 'login#index', :as => :login 
    match '/login' => 'login#check', :as => :check_login 
    match '/dashboard' => 'dashboard#index', :as => :dashboard  
end 

login_controller.rb

class LoginController < ApplicationController 

    def index 
     # some index logic 
    end 

    def check 

    # authenticate with mite.yo.lk account login 

    Mite.account = params[:domain] 
    Mite.authenticate(params[:email], params[:password]) 
    if Mite.validate 
     redirect_to dashboard_path 
    else 
     flash[:error] = "not valid" 
     render :template => 'login/index' 
    end 
    end 

end 

回答

2

在你的路線,你正在路由'/登錄'到check行動,然後在那個行動中,你正在渲染一個失敗的驗證模板。渲染不會更改URL,這就是爲什麼最終使用URL'/ login'。

如果希望用戶看到失敗的登錄嘗試後根URL,那麼你就需要更改renderredirect_to :index

if Mite.validate 
    redirect_to dashboard_path 
else 
    flash[:error] = "not valid" 
    redirect_to :index 
end 

或者,你可以更換您的check_login路徑使用根URL與POST請求,並給你的根路徑login路線只對GET請求,就像這樣:

constraints(Subdomain) do 
    get '/' => 'login#index', :as => :login 
    post '/' => 'login#check', :as => :check_login 
    match '/dashboard' => 'dashboard#index', :as => :dashboard  
end 

如果你這樣做,那麼你應該能夠離開你的電流控制器代碼就是這樣,並得到你想要的結果。

+0

Aaaah肯定。謝謝:)順便說一句:這是一個好習慣嗎?或者我應該實施這種行爲嗎? – Slevin

+1

我剛剛添加了一個替代方案。通常,最佳做法是儘可能使用資源,並且如果不是至少指定HTTP動詞而不是「匹配」(它將匹配任何HTTP動作)。 –

+0

非常感謝! – Slevin