0

Railsチュートリアル(railstutorial.org)を実行していますが、検証が行われるときにサインインフォームに問題があることに気付きました。このアクションの私のルートは次のとおりです。

match '/signin',  to: 'sessions#new'

検証が行われると、ページのURLが/sessionsに切り替わります。セッションのコントローラーは次のようになります。

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = "Invalid email/password combination"
      render 'new'
    end
  end

私の質問は、この検証済みのフォームを/signinのURLで引き続き表示する方法です。ありがとうございました。

4

1 に答える 1

1

Restfulルーティング(Railsの現在の長年の標準)を使い続けたい場合は、できません。このパスから逸脱してもかまわない場合は、「通常の」リソーススタイルのルーティングを使用する代わりに、いくつかのカスタムルートを作成できます。

まず、コントローラーを変更し、サインインアクションをcreateメソッドからnewメソッド(/ signinのルーティング先)に移動する必要があります。

class SessionsController < ApplicationController
  def new
    if request.post?
      user = User.find_by_email(params[:session][:email])
      if user && user.authenticate(params[:session][:password])
        sign_in user
        redirect_back_or user
      else
        flash.now[:error] = "Invalid email/password combination"
      end
    end
  end
end

これは、最初のGET/signinリクエストと最終的なPOST/signinリクエストの両方が同じアクションによって処理されることを意味します。POSTが検出された場合、POSTはユーザーにログインし、成功するとリダイレクトしようとします。GETリクエストが行われた場合、フォームは通常どおりにレンダリングされます。

次に、ログインフォーム(app / views / sessions / new.html.erb)を変更して、通常のルートの代わりにサインインパスを使用する必要があります。

<% form_tag '/signin' do %>
  ....
<% end -%>

それはそれをする必要があります。

于 2012-08-14T21:16:28.403 に答える