2011-01-23 20 views
4

私は非ユーザモデルのビュー内にフォームを書いて、訪問者がログインできるようにしました。私はまずこれが機能しているかどうかチェックしたい。だから私はテストをするためにアクション "インデックス"を作る。URLが間違ったURLにルーティングされる

<%form_tag(:controller=>"users",:action=>"index") do %> 
    Name: <%=text_field_tag "name" %><br>  
    Password: <%=password_field_tag "password" %><br> 
    <%=submit_tag "Login" %> 
<% end -%> 

驚くべきことに、ブラウザのナビゲーションバーがまだ表示しながら、ルーティングは「新しい」ビューにページを向けレール:私はページを更新すると

http://0.0.0.0:3000/users 

、それは通常の「インデックス」ページが表示されます。

どうしてですか?

:actionのコードを:action=>"new"に変更した場合、画面に「ルーティングエラー」と表示されます。リフレッシュすると、通常の「新しい」ビューが表示されます。次のように

users_controller.rbは次のとおりです。次のように

class UsersController < ApplicationController 

    def index 
    @users=User.all 
    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @users } 
    end 
    end 

    def show 
    @user = User.find(params[:id]) 
    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @user } 
    end 
    end 

    def login 
    flash[:notice]="Hello"; 
    end 

    def new 

    end 

    def create 
    @user = User.new(params[:project]) 

    respond_to do |format| 
     if @user.save 
     format.html { redirect_to(@user, :notice => 'user was successfully created.') } 
     format.xml { render :xml => @user, :status => :created, :location => @user } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @user.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 

私のroutes.rbをが行く:

Testdrive::Application.routes.draw do 

    resources :users do 
    member do 
     post 'login' 
    end 
    end 
    resources :cars 
+0

コントローラのコードは何ですか?問題はそこにある。 –

+0

レール3ルーティングは今私にスパゲッティに見える~~ – lkahtz

+0

これはrails3のバグですか? – lkahtz

答えて

5

Apneadivingの答えが正しい、しかし、私はそれはいくつかのことを明確にすることが重要だと思う:

何ページあなたはにユーザーを取得しようとしていますか?ユーザーがインデックスページにアクセスするように思えます(ユーザーが新しいページにアクセスしていることに驚いています)。

最初に: HTTPリクエストの種類とコントローラがブラウザを指示する場所の関係を理解する必要があります。 http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

フォームは、基本的にPOSTリクエストを/users URLに送信しています。コントローラーは、常にこのアドレスにPOSTSをCREATEアクションにルーティングします。したがって、Apneadivingが説明したように、送信しているポストパラメータはCREATEが期待しているものではないため、保存に失敗してusers/new

にリダイレクトされました。あなたのフォームには、:controller => 'users', :action => 'index'が表示されています。だから、これは人々がインデックスページに上陸してほしいと思うところです。しかし、あなたが理解する必要があるのは、Railsフォームヘルパーがコントローラレイヤーに魔法のようにリンクされていないということです。

2番目:情報フローは、基本的にはRailsの一方向性です。モデルからのものはコントローラに行くことができますが、それ以外の方法はありません。コントローラーからのものはビューに行くことができますが、それ以外の方法ではありません。

コントローラーがユーザーから受信できるのは、HTTP要求だけです。フォームタグヘルパーを使用するときは、actionmethodという属性のHTML form要素を定義するためのショートカットを使用しています。 http://www.w3.org/TR/html401/interact/forms.html#h-17.13

:action => 'index'を指定しても、フォームは依然としてPOST要求を送信しています(デフォルトではPOST)。コントローラーは、ユーザーがインデックスアクションを要求したことを意味していることを知らず、/users URLにGETではなくPOSTを受信したことを知っているだけです。したがって、その要求をCREATEアクションにルーティングします。

これはRESTのすべてです。

ソリューション:

あなたは既に事前に定義されていないアクションを使用する必要があります。

resources :users do 
    member do 
    post 'login' 
    end 
end 

このコードは正しくusers/123/loginへのPOSTリクエストを受け入れるだろう:あなたが入れたときにこれを実行しようとしたようなあなたのルートではそれが見えます。

ただし、これはCOLLECTION自体ではなくユーザーのコレクションのMEMBERに指定したため、その要求が正しく処理されるためには特定のUSER_IDを指定する必要があります。この操作を使用してログインしているため、これは必要なものではありません。 COLLECTION(:users/login IE):のためにこのルートを指定しているあなたが代わりに行うために必要なものhttp://guides.rubyonrails.org/routing.html#nested-resources

を参照してください

resources :users do 
    collection do 
    post 'login' 
    end 
end 

その後、フォームで、:controller => 'users', :action => 'login'を言うためにあなたのformタグを変更します。

最後に、あなたのコントローラでは、ログインアクションを指定する必要があります。この場合、次のように簡単にすることができます。

def login 
    redirect_to users_path 
end 

すべての操作はPOSTを受け取り、インデックスにリダイレクトされます。ただし、フォームのパラメータを固定する場合は、LOGINアクションでそれらのパラメータを処理する必要があります。これらはリダイレクト後も保持されず、INDEXアクションで使用できるようになります。

これはあなたのために物事をクリアすることを願っています。がんばろう!

+0

ありがとうアンドリュー。あなたはとても素晴らしいです~~これは非常に非常に徹底して役立ちます!今、私はレールのルーティングがどのように機能するかについてははっきりしています。はい、私はレールを新しくしているので、しばらくレール3を使っています。それはすべて楽しいです〜あなたの患者の答えを持っているので素敵です。私はあなたに2つの票を与えたい〜 – lkahtz

+0

くそー!あなたは私のポイントを盗んだ:D – apneadiving

+0

:)申し訳ありませんが放課後!良いスポーツをしていただきありがとうございます! – Andrew

2

あなたの問題は、あなたのroutes.rbをです。見てくださいhere。例は非常に明確です:

resources :photos do 
    member do 
    get 'preview' 
    end 
end 

説明「これはGETで/ photos/1/previewを認識します。

コードに戻ると、post login行は意図した場所につながりません。

代わりに、投稿要求はresources :usershereを参照)と入力して尋ねたものなので、「作成」ビューに向けられます。 それは正しく保存されていない、それはのbeacause、「新しい」ビューにリダイレクトするので:

else 
    format.html { render :action => "new" } 

だから何ソリューション?ここではいくつかの曲は以下のとおりです。

  • はあなたのログをチェックし、彼らはあなたのparamsをチェックし、ブレークポイントを入れて、
  • あなたの変数をチェックする
  • 使用レールの--debuggerをデバッグするためのリソースである必要があり、私は理解していませんなぜ新しいユーザーを作成するためにparams[:project]に頼っているのですか?
+0

あなたはとても素晴らしいです!〜私はあなたの返信ごとにチェックアウトします...ありがとうたくさん〜 – lkahtz

関連する問題