0

ログインフォームを実装しようとしていますが、ルーティングが間違っているようです。認証が失敗すると、アプリは subdomain.domain.com/login にリダイレクトしますが、ログイン ページのみを再度レンダリングする必要があります ("/login" のない subdomain.domain.com のみ)。

ビュー/ログイン/index.html

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

ルート.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
4

1 に答える 1

2

ルートでは、「/login」をcheckアクションにルーティングしており、そのアクションで失敗した検証のテンプレートをレンダリングしています。レンダリングは URL を変更しないため、URL は「/login」になります。

ログイン試行が失敗した後にユーザーにルート URL を表示する場合は、を次のように変更する必要がありrenderますredirect_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

これを行うと、現在のコントローラー コードをそのままにして、必要な結果を得ることができるはずです。

于 2012-10-27T10:06:53.323 に答える