Использование именованных маршрутов с параметрами и form_tag

Я пытаюсь создать простую форму поиска в 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:

Не удалось сгенерировать search_url из {:action=>"search",:controller=>"home"} - у вас могут быть неоднозначные маршруты, или вам может потребоваться указать дополнительные параметры для этого маршрута. У 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

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

2 ответа

Решение

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

Возможно, есть и лучшие способы сделать это;)

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

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

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

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

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

Другие вопросы по тегам