編集時に追加、2013-02-11:
私が抱えている問題は、正しいHTMLコードを生成するために作成したERBコードを取得できないことではないことを明確にする必要があります。むしろ、私のRailsインストールはHTMLコードを正しく解釈することがあるので、リンクをクリックすると正しい効果が得られ、場合によっては誤って「ルートなし」エラーが発生します。以下の私の答えの詳細。
元の質問、2013-02-08:
Rails3.2.11を使用して簡単なログインフォームを作成しています。フォームの[送信]ボタンをコーディングするいくつかの方法を試しましたが、ルートの欠落エラーが原因でそれぞれが失敗しました。動作するメソッドを1つ取得し、コードをチェックインしました。ただし、今ではまったく同じコードが失敗します。
これは次のコードですapp/views/session/new.html.erb
(私はを使用してsimple_form
いますが、ボタンラッパーは使用していません):
<h2>Log in</h2>
<%= simple_form_for :session do |f| %>
<%= f.input :username %>
<%= f.input :password %>
<%= button_to "Submit", session_index_path %>
<% end %>
これが生成するHTMLコードの関連部分は次のとおりです。
<h2>Log in</h2>
<form accept-charset="UTF-8" action="/session/new" class="simple_form session" method="post" novalidate="novalidate">
<div style="margin:0;padding:0;display:inline">...</div>
...the input fields...
<form action="/session" class="button_to" method="post">
<div>
<input type="submit" value="Submit" />
<input name="authenticity_token" type="hidden" value="...token value here..." />
</div>
</form>
</form>
これは私のconfig/routes.rb
です:
MyApp::Application.routes.draw do
resources :at_user
resources :session, :only => [:new, :create, :destroy]
match 'login' => 'session#new', as: :login
match 'logout' => 'session#destroy', as: :logout
root to: 'main#index'
end
これは、コマンドがrake routes
出力するものです。
at_user_index GET /at_user(.:format) at_user#index
POST /at_user(.:format) at_user#create
new_at_user GET /at_user/new(.:format) at_user#new
edit_at_user GET /at_user/:id/edit(.:format) at_user#edit
at_user GET /at_user/:id(.:format) at_user#show
PUT /at_user/:id(.:format) at_user#update
DELETE /at_user/:id(.:format) at_user#destroy
session_index POST /session(.:format) session#create
new_session GET /session/new(.:format) session#new
session DELETE /session/:id(.:format) session#destroy
login /login(.:format) session#new
logout /logout(.:format) session#destroy
root / main#index
のターゲットパスはbutton_to
です。これにより、のメソッドが呼び出されるsession_index_path
はずです。しばらくの間、呼び出されました。Railsを再起動した後、ボタンを押すと、代わりにエラーページが表示されます。create
SessionController
No route matches [POST] "/session/new"
何らかの理由で、Railsはのターゲットがでbutton_to
はsession#new
なくであると考え始めましたsession#create
。呼び出すことになっているHTTPメソッドがPOSTではなくGETであると考えているかのようですが、HTMLコードはメソッドがpostであることを示しています。
ちなみに、私が以前に試したもう1つのことは、ここbutton_to
に記載されているように、アクションとメソッドのパラメーターを指定することでした。
<%= button_to "Submit", options: {action: 'create', method: :post} %>
次に、これが生成されます。
<form action="/session/new?options%5Baction%5D=create&options%5Bmethod%5D=post" class="button_to" method="post">
これも私が望むものとは思えません。 button_to
のデフォルトのHTTPメソッドはPOSTで、これは結果に表示されますが、:options
ハッシュはURLの末尾に追加されるだけで、単語は他のcreate
どこにも表示されません。
この質問に対する最初の答えは、ドキュメントに記載されているものとは異なり、のパラメータをbutton_to
ハッシュに入れるのではなく、直接与える必要があるということです。だから、私はこれを試しました:
<%= button_to "Submit", action: 'create' %>
ただし、アクションcreate
は生成されたHTMLには表示されません。
<form action="/session" class="button_to" method="post">
ですから、これらは私が名前付きパスメソッドを使用する前に試したもので、1分間は機能しましたが、不思議な理由で、もう機能しません。
私が間違っていることについて何か考えはありますか?(それはおそらく私が見落としていた明らかなことです。)