Использование именованных маршрутов с параметрами и form_tag - PullRequest
6 голосов
/ 30 января 2010

Я пытаюсь создать простую форму поиска в 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 из именованного маршрута name в результате поиска. Спасибо, ребята!

Ответы [ 2 ]

4 голосов
/ 30 января 2010

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

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

2 голосов
/ 30 января 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...