2

編集時に追加、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を再起動した後、ボタンを押すと、代わりにエラーページが表示されます。createSessionController

No route matches [POST] "/session/new"

何らかの理由で、Railsはのターゲットがでbutton_tosession#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&amp;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分間は機能しましたが、不思議な理由で、もう機能しません。

私が間違っていることについて何か考えはありますか?(それはおそらく私が見落としていた明らかなことです。)

4

3 に答える 3

1

ドキュメントは実際にはいくつかの場所で間違っていbutton_toます(ここで私の答えに注意してください:Rails 3.2.11でこのbutton_toが正しくレンダリングされないのはなぜですか?)。その[送信]ボタンを修正するには、次を使用します。

<%= button_to "Submit", { action: 'create' }, method: :post %>

optionsハッシュとハッシュは、達成しようとしていることに応じて、中括弧html_optionsを使用して明示的に分離する必要があります。{}

toのHTTPメソッドがアクションにルーティングされるため、アクションはcreateURLに表示されません。POST/sessioncreate

于 2013-02-08T15:45:41.647 に答える
1

これまでのところ、上記のコメントでCyleが提案した方法、つまり宣言に追加url: session_index_pathする方法が最もうまくいくようです:simple_form_for

<h2>Log in</h2>
<%= simple_form_for :session, url: session_index_path do |f| %>
  <%= f.input :username %>
  <%= f.input :password %>
  <%= button_to "Submit" %>
<% end %>

このコードによって生成された [送信] ボタンをクリックしたときに、ルート エラーが発生したことはまだありません。

ただし、私がまだ解決していない基本的な問題は、Rails の気まぐれであるため、この回答は受け入れません。つまり、以前は機能していたコードが突然機能しなくなります。たとえば、今日、私は最初に次のコードを試しました。

<%= simple_form_for :session do |f| %>
  <%= f.input :username %>
  <%= f.input :password %>
  <%= button_to "Submit1" %>
  <%= button_to "Submit2", session_index_path %>
<% end %>

「Submit2」ボタンを押すとうまくいきました。ただし、ボタン「Submit1」を含む行を削除し、Rails サーバーを停止して再起動し (試行のたびに行ったように)、ページをリロードすると、Submit2 ボタンを押すと「No route」エラーが発生しました。ボタンの HTML コードは同じままですが、

<form action="/session" class="button_to" method="post">
  <div>
    <input type="submit" value="Submit2" />
    <input name="authenticity_token" type="hidden" value="...this value was the same also..." />
  </div>
</form>

非常に不可解です。それほどエキゾチックではありませんが、私のセットアップの詳細に関連している可能性があります。

編集時に追加:

Cyle の方法で生成された HTML の関連部分を調べたところ、他のほとんどすべての場合と同じであることに気付きました。

<form accept-charset="UTF-8" action="/session" class="simple_form session" method="post" novalidate="novalidate">
  <div style="margin:0;padding:0;display:inline">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="authenticity_token" ... />
  </div>
  ...the username and password input fields...
  <form action="/session" class="button_to" method="post">
  <div>
    <input type="submit" value="Submit" />
    <input name="authenticity_token" type="hidden" value="voOGIAbJfwvjxVRbk02V5l6zn6iwvOiMvaeauPBIrqU=" />
  </div>
</form>

したがって、これがこれまでのところうまくいったのは幸運かもしれません。

于 2013-02-11T12:29:39.230 に答える