1

:new、:create、および :delete アクションを備えたセッション コントローラーがあります。現在のページ コントローラーをチェックするメソッドもあります。

def controller_for(path)
  Rails.application.routes.recognize_path(path)[:controller]
end

通常、このメソッドは正常に機能しますが、ユーザーがアクセス/loginしてログイン情報が正しくない場合、レールは URL を変更/sessionsしてアクションをレンダリングし、:newその時点で上記のメソッドはエラーをスローします。

No route matches "/sessions"

これrecognize_pathをやろうとしているようです:

>> r = Rails.application.routes
>> r.recognize_path "/sessions"
=> {:controller=>"sessions", :action=>"index"}

インデックス アクションがないため、エラーが発生しています。私が本当に欲しいのは、これです:

>> r.recognize_path "/login"
=> {:controller=>"sessions", :action=>"new"} 

/loginでは、サインインが失敗したときの URLを/sessions.

4

1 に答える 1

2

問題は、安らかなルートを使用していることです。ログイン フォームを投稿すると、セッションが「作成」されます。これは、/sessions に投稿することによって実現されます。これは に向けられていSessionsController#createます。/login はSessionsController#new、基本的に /sessions/new.

recognize_path環境が特に指示しない場合、パスを GET リクエストとして解釈するようにデフォルト設定されています。また、GET 要求は/sessions、インデックス ビューを意味すると見なされます。

# The recognize_path method in the Rails source:
def recognize_path(path, environment = {})
  method = (environment[:method] || "GET").to_s.upcase
  ...
end

これを「修正」する 1 つの方法は、ルーティングを変更することです。たとえば、これをルートに追加できます。

match "/process_login" => "sessions#create", :as => 'process_login'

次に、ログインフォームを一致するように変更します。

<% form_tag process_login_path do %>
  [your login form here]
<% end -%>

ここで、フォームを /sessions ではなく /process_login に投稿すると、認識エンジンによってパスが適切に解釈されるはずです。

于 2012-08-14T20:41:12.960 に答える