レンダリングを取得してカスタムルーティングパスを認識する
-
04-07-2019 - |
質問
したがって、ログイン用のおしゃれなカスタムルートがあります
# routes.rb
map.login '/login', :controller => 'sessions', :action => 'new'
www.asite.com/loginにアクセスしてください。ただし、失敗したログインではカスタムであるため、アクションでは次のことを行います。ログインに失敗するとどうなるかに注意してください。
# sessions_controller.rb
def create
self.current_user = User.authenticate(params[:email], params[:password])
if logged_in?
# some work and redirect the user
else
flash.now[:warning] = "The email and/or password you entered is invalid."
render :action => 'new'
end
end
これは非常に典型的なものです。新しいアクションをレンダリングし、再度ログインを要求するだけです。残念ながら、www.asite.com / sessionといういURLも取得できます。イック!元のURLを尊重するようにレンダリングすることは可能ですか?
正しい解決策はありません
他のヒント
問題はこれです。ユーザーが最初に / login
にアクセスしてフォームに入力します。フォームを送信すると、 / sessions
にPOSTされるため、ブラウザーのURLが変更されます。これを回避するには、次の2つのことができます。
マイケルが述べたように、:newアクションにリダイレクトして、elseを:に変更できます
else
flash[:warning] = "The email and/or password you entered is invalid."
redirect_to login_path
end
次のリクエスト(リダイレクト後)でメッセージを利用できるように、フラッシュを変更する必要があることに注意してください。
2番目の方法は少しハッカーですが、言及する価値があるかもしれません。ルートの条件を使用すると、ログインフォーム(GET)とフォーム送信(POST)の両方を同じパスにマップできます。次のようなもの:
map.login '/login',
:controller => 'sessions', :action => 'new',
:conditions => {:method => :get}
map.login_submit '/login',
:controller => 'sessions', :action => 'create',
:conditions => {:method => :post}
フォームアクションがログイン送信パスの場合、期待どおりに機能するはずです。
変更 render:action =>
redirect_to login_path
所属していません StackOverflow