Передача параметра в форму - PullRequest
2 голосов
/ 22 июня 2011

У меня есть такой маршрут:

match '/:search/:page', :to => 'search#create'

и в моей форме:

<%= form_for :search, :url => {:controller => 'search', :action => 'create', :page => 1, :search => ???} do |f| %>

Мне нужно передать что-то в :search, но я хочу, чтобы это было значениекоторый представлен с формой.Что мне делать?

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Нет прямого способа сделать это, так как форма с URL-адресом (действием) должна отображаться до того, как пользователь введет что-либо в поиск.Таким образом, вам нужно начальное значение, но оно может не иметь смысла, когда вы не знаете, что пользователь хочет ввести. Форма GET с параметрами решит эту проблему, но я предполагаю, что вы хотите "хорошие" URL-адреса поиска.

В общем случаеЕсть два варианта:

  1. Вы не можете изменить путь URL-адреса путем простой отправки формы - могут быть добавлены только параметры (? x = 1 & y = 2 ...).Но вы можете изменить весь URL-адрес с помощью JavaScript, когда пользователь вводит что-либо для поиска ввода (onchange) или отправляет форму (onsubmit).

  2. Используйте другое действие, которое получит входные значения стандартной формы, а затем перенаправит егона правильный URL.Например, /searchforward?search=Query&page=1 следует переслать на /Query/1.

rout.rb:

match 'searchforward', :to => 'search#searchforward'
match '/:search/:page, :to => 'search#create', :as => :search

, контроллер:

def searchforward
  redirect_to search_path(params[:search],params[:page]
end
0 голосов
/ 22 июня 2011

Если вы установите значение в form_for, где оно у вас есть сейчас, оно будет частью адреса, на который отправляется форма, поэтому вы сможете получить его в контроллере через params[:search].

Вы также можете создать текстовое поле (текстовое поле, поле выбора и т. Д.), Чтобы пользователь мог заполнить значение, например, например. описано в APIDock . Вы даже можете иметь скрытое поле, которое не будет отображаться пользователю, но все равно будет отправлено вместе с формой. В любом случае он будет доступен через params[:search].

Редактировать Другой способ понять ваш вопрос заключается в том, что вы хотите, чтобы параметр search в form_for :url передавался динамически в зависимости от того, что набрал пользователь. В этом случае я могу придумать три решения:

Вариант 1 . Отправьте форму куда-нибудь независимо от :search и перенаправьте оттуда:

Форма: form_for :search, :url=>{:controller=>"search", :action=>"handle"} SearchController

def handle
  case params[:search] of
    when :foo then redirect_to some_path(params[:search], ...)
    when :bar then redirect_to other_path(params[:search], ...)
  end
end

Недостатком является то, что вы не можете сделать POST-перенаправление, только GET. Преимущество в том, что форма обрабатывается в одном месте. Так как это - почему бы не включить всю обработку и пропустить перенаправление? Это был бы вариант, который я бы рассмотрел.

Вариант 2 . Используйте некоторый JavaScript для изменения параметра action HTML-элемента form перед отправкой.

Вариант 3 . Используйте некоторый JavaScript для генерации формы на основе более раннего выбора.

В этом сценарии есть две формы, только одна из которых может быть отправлена ​​пользователем через кнопку. Первая форма содержит только раскрывающийся список (текстовое поле, переключатели) и средство просмотра формы JavaScript. Основываясь на значении, этот наблюдатель отображает правильную форму - обратите внимание, что введенное пользователем значение :search известно в этот момент при визуализации формы.

Конечно, вместо первой формы вы можете использовать коллекцию ссылок, если выбор :search доступных пользователю вариантов ограничен. Вариант 3, вероятно, не идеален с точки зрения производительности, но должен быть достаточно хорош, чтобы расширить, понять и использовать его позже.

Возможно, есть и другие способы сделать это.

...