2009-05-09 20 views
2

私はRoRの新人です。ルーティングに関する質問があります。私はアプリケーションとシンプルなユーザーログインシステムを設定しました(はい、そこには既にログインジェネレータがあることを知っています、私は自分でそれを試してみたかったのです)。私は、ユーザーがログインしているかどうかを確認する特定のアクションについてbefore_filterを持っています。そうでなければ、それらをログインページにリダイレクトする。これは私がそれをルーティングした方法です、これは正しく見えますか?私はRuby on Railsルーティング

:login => :post 

:login => :get 

を変更した場合

map.resources :user, :collection => { :login => :get } 

も、なぜそれが 'ショー' ビューを表示していますか?

答えて

4
map.resources :user, :collection => { :login => :get } 

は、URLに対応しますリソースには、urlに加えてリクエストメソッドに応じてurlをアクションにマップします。

したがって、上記の最初のルートはGETを/ users/loginにログインアクションの にマップしますが、postに変更するとGETは/ users/loginにデフォルトにマップされます。あなたが望むものではない、「ログイン」というIDを持つユーザの「ユーザ」コントローラと「ショー」アクションです。 (POSTを/ users/loginと 'login'アクションにマッピングします)

+0

あなたの答えをありがとう、私は実際により良いRoRのルーティングの全体の概念を理解しています... –

0

それは近いのですが、あなたは試してみたいことがあります。

map.resources :users, :member => { :login => :get } 

彼らの主な違いは、:collectionキーワードがあなたの新しいルートは(このような「指標」など)、そのリソースのコレクションを扱っているときに使用されるべきであるということですリソースの単一のインスタンス(ログインしている単一のユーザーなど)ではありません。

また、/users/user_id/loginがログインページにリダイレクトしても、そこではGET操作が実行されています。 POSTを使用するフォームを送信するときです。したがって本質的には、GETを受け取っていたときにPOSTを期待するようにRailsに指示していました。私はただloginのルートを無視していて、URLに表示されていたどんなユーザーでも戻していると推測できます。ユーザーが参照している:ので、 "/ユーザ/ログイン"

map.resources :users, :member => { :login => :get } 

は "/ユーザ/ 123 /ログイン"

のようなURLに対応するであろうように

0

ログインシステムに別のリソースを使用することをお勧めします。あなたはあなたがそのようなログインフォームを表示し、それぞれ、それを提出するための#NEWと#createなどの通常CRUDメソッドを使用します

map.resource :session 

を持っていると思いますので、多くの人がセッションを使用しています。また、これらの要求を処理するためにセッションコントローラを作成する必要があります。