2010-01-30 3 views
6

Я пытаюсь создать простую форму поиска в Rails, но я думаю, что чего-то не хватает.Использование именованных маршрутов с параметрами и form_tag

У меня есть именованный маршрут для поиска:

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:

search_url failed to generate from {:action=>"search", :controller=>"home"} - you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: [:first_name, :last_name] - are they all satisfied?

Что мне не хватает? Я думал, что поля, определенные в моей форме, будут автоматически связаны с параметрами моего маршрута. : -/

Update:

Я понимаю, что 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 

Это все работает удовольствие! Основная цель здесь заключалась в получении этого URL-адреса от имени названного маршрута в результате выполнения поиска. Спасибо, парни!

ответ

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, который возвращает параметры из submit и затем перенаправляет на правильный путь.

Вероятно, есть и некоторые более эффективные способы сделать это;)

+0

Я только что заработал с вашим вариантом №2 - я создал еще один маршрут и другое действие. Благодаря! –

+0

Возможно, было бы лучше сделать это в обоих направлениях. Так что сделайте это 2. способ по умолчанию, и если js работает, измените 'action' на js - чтобы он мог работать без перенаправления. – klew

2

Во-первых, search_path - фактически метод, который принимает хэш опций. Именно этот метод должен получать :first_name и :last_name.

Во-вторых, браузер может отправлять только параметры формы в качестве тела запроса POST или как строка запроса параметров (для любого метода запроса). Поэтому, к сожалению, нет никакой возможности, чтобы исходная функция отправки браузера могла генерировать такой URL.

Другой способ думать об этом: то, что вы здесь делаете, заполняет атрибут действия тега формы URL. Rails требует полного URL-адреса при создании формы. Таким образом, все параметры вашего маршрута должны быть указаны при вызове помощника формы, а не на следующем запросе POST.

Так что, к сожалению, то, что вы пытаетесь сделать, невозможно в обычном приложении Rails.

(Если вы действительно этого захотите, вы можете снять его, написав собственные помощники формы и немного Javascript для замены собственной функции отправки браузера. Затем Javascript построит этот URL-адрес на основе полей формы . Я бы возражать против этого, хотя)

+0

Это вполне возможно для HTML формы для отправки HTTP GET параметров. Посмотрите URL-адрес при поиске Google, например. –

+0

Но то, что он пытается сделать, это не * параметры строки запроса *, они являются частью пути URL. –

+0

Извините, я неправильно понял вопрос. –

Смежные вопросы