2012-10-27 25 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