Использование именованных маршрутов с параметрами и 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
, Но приведенный выше пример не будет работать так, как вы ожидали.
Так что вы можете сделать?
Создать пустую форму, которая имеет
action='/'
и с помощью js замените его содержимым ваших текстовых полей перед отправкой.Создайте другой маршрут, например
/search
это получает параметры от отправки и затем перенаправляет на правильный путь.
Возможно, есть и лучшие способы сделать это;)
Первый, search_path
на самом деле это метод, который принимает хэш опций. Именно этот метод должен получить :first_name
а также :last_name
,
Во-вторых, браузер может отправлять параметры формы только как тело запроса POST или как параметры строки запроса (для любого типа метода запроса). Так что, к сожалению, нативная функция отправки в браузере не может генерировать такого рода URL.
Еще один способ думать об этом: то, что вы делаете здесь, - это заполнение атрибута действия тега формы URL-адресом. Rails необходим полный URL при создании формы. Таким образом, все параметры в вашем маршруте должны быть указаны при вызове помощника по форме, а не при следующем запросе POST.
Так что, к сожалению, то, что вы пытаетесь сделать, невозможно в обычном приложении Rails.
(Если вы действительно этого хотите, вы можете сделать это, написав свои собственные помощники по форме и немного Javascript для замены встроенной функции отправки браузера. Затем Javascript создаст этот URL на основе полей формы. возразить против этого все же.)