6

Rails で簡単な検索フォームを作成しようとしていますが、何か足りないと思います。

検索用の名前付きルートがあります:

map.search ":first_name/:last_name", :controller => "home", :action => "search"

私は検索フォームでそれを使用しようとしています:

<% form_tag(search_path, :method => 'get') do %>
  <%= text_field_tag(:first_name) %>
  <%= text_field_tag(:last_name) %>
  <%= submit_tag("Search") %>
<% end %>

しかし、検索フォームをロードすると、ActionController::RoutingError: が表示されます。

{:action=>"search", :controller="home"} から search_url を生成できませんでした - あいまいなルートがあるか、このルートに追加のパラメーターを指定する必要がある可能性があります。content_url には次の必須パラメータがあります: [:first_name, :last_name] - すべて満足していますか?

私は何が欠けていますか?フォームで定義されたフィールドは、ルート パラメーターと自動的にリンクされると思いました。:-/

アップデート:

現在、フォームが表示される前に search_path が生成されているため、更新できないことがわかりました。後から考えると一目瞭然!

ルートを変更しました:

map.search 'search', :controller => "home", :action => "search"
map.name ':first_name/:last_name', :controller => "home", :action => "name"

そして今、searchアクションは次のことを行います:

def search
  redirect_to name_path(params)
end

それはすべて御馳走になります!ここでの主な目標は、検索を行った結果として、routeという名前の名前からその URL を取得することでした。みんなありがとう!

4

2 に答える 2

4

form_forフォームを生成し、作成に必要なすべてのパラメーターを指定する必要があるためsearch_path、次のようになります。

<% form_tag(search_path, :firstname => 'some_text', :lastname => 'some_text', :method => 'get') do %>

または少なくともこのようなもの。HTML タグformにはパラメータaction='/some/url'があるため、 のすべてのパラメータを指定する必要がありますsearch_path。しかし、上記の例は期待どおりには機能しません。

では、何ができるでしょうか?

  1. を持つ空のフォームを作成action='/'し、js を使用して、送信する前に入力テキスト フィールドの内容に置き換えます。

  2. /searchたとえば、送信からパラメーターを受け取り、正しいパスにリダイレクトする別のルートを作成します。

おそらく、それを行うためのより良い方法もいくつかあります;)

于 2010-01-30T13:23:31.533 に答える
2

まず、search_path実際にはオプションのハッシュを取るメソッドです。:first_nameそして受け取るべきはこの方法:last_nameです。

第 2 に、ブラウザーはフォーム パラメーターを POST 要求の本文として、またはクエリ文字列パラメーター (あらゆる種類の要求メソッド) としてのみ送信できます。残念ながら、ブラウザーのネイティブの送信機能でそのような URL を生成する方法はありません。

別の考え方: ここで行っていることは、form タグの action 属性に URL を入力することです。フォームを作成する際、Rails は完全な URL を必要とします。したがって、次の POST リクエスト時ではなく、フォーム ヘルパーが呼び出されたときに、ルート内のすべてのパラメーターを指定する必要があります。

残念ながら、あなたがやろうとしていることは、通常の Rails アプリケーションでは不可能です。

(本当にやりたい場合は、独自のフォーム ヘルパーと、ブラウザーのネイティブ送信機能を置き換える Javascript を少し書くことで、それを実現できるかもしれません。Javascript は、フォーム フィールドに基づいてその URL を構築します。反論しますが。)

于 2010-01-30T13:00:46.703 に答える