レンダリングを取得してカスタムルーティングパスを認識する

StackOverflow https://stackoverflow.com/questions/231538

  •  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

への「新規」
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top