2010-01-30 23 views
6

Estoy intentando crear un formulario de búsqueda simple en Rails, pero creo que me falta algo.Usar rutas con nombre con parámetros y form_tag

que tienen una ruta de llamada para la búsqueda:

map.search ":first_name/:last_name", :controller => "home", :action => "search" 

Estoy tratando de utilizar que en mi formulario de búsqueda:

<% form_tag(search_path, :method => 'get') do %> 
    <%= text_field_tag(:first_name) %> 
    <%= text_field_tag(:last_name) %> 
    <%= submit_tag("Search") %> 
<% end %> 

Pero cuando me carga el formulario de búsqueda Puedo obtener una 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?

¿Qué me falta? Pensé que los campos definidos en mi formulario se vincularían automáticamente con mis parámetros de ruta. : -/

Actualización:

entiendo que se genera search_path antes de que aparezca el formulario ahora, por lo que no se puede actualizar. ¡Obvio en retrospectiva!

he cambiado de rutas:

map.search 'search', :controller => "home", :action => "search" 
map.name ':first_name/:last_name', :controller => "home", :action => "name" 

Y ahora la acción search sólo hace:

def search 
    redirect_to name_path(params) 
end 

funciona todo un lujo! El objetivo principal aquí era obtener esa URL del nombre ruta nombrada como resultado de hacer una búsqueda. ¡Gracias chicos!

Respuesta

4

form_for genera la forma y tiene que haber especificado todos los parámetros que se necesitan para crear search_path, por lo que debe ser similar:.

<% form_tag(search_path, :firstname => 'some_text', :lastname => 'some_text', :method => 'get') do %> 

o al menos algo Me gusta esto. La etiqueta HTML form tiene el parámetro action='/some/url' y es por eso que debe especificar todos los parámetros para search_path.Pero el ejemplo anterior no funcionará como esperabas.

¿Qué puedes hacer?

  1. crear la forma vacía que tiene action='/' y con js sustituirlo por el contenido de los campos de texto de entrada antes de enviar.

  2. Crea otra ruta, en el ejemplo /search que recibe los parámetros del envío y luego redirige a la ruta correcta.

Probablemente también hay algunas formas mejores de hacerlo;)

+0

Acabo de hacerlo funcionar con su opción n. ° 2: creé otra ruta y otra acción. ¡Gracias! –

+0

Probablemente sería mejor hacerlo en ambos sentidos. Así que haz 2. way en el modo predeterminado y si js está funcionando, entonces cambia 'action' con js para que pueda funcionar sin redireccionar. – klew

2

En primer lugar, search_path es en realidad un método, que tiene un hash de opciones. Es este método que debe recibir :first_name y :last_name.

En segundo lugar, un navegador solo puede enviar parámetros de formulario como el cuerpo de una solicitud POST, o como cadena de consulta parámetros (para cualquier tipo de método de solicitud). Desafortunadamente, no hay manera de que la función de envío nativa de un navegador pueda generar ese tipo de URL.

Otra forma de pensar: lo que estás haciendo aquí es rellenar el atributo de acción de la etiqueta de formulario con una URL. Rails necesita una URL completa a medida que crea el formulario. Por lo tanto, todos los parámetros en su ruta deben especificarse cuando se llama al ayudante de formulario, en lugar de en la siguiente solicitud POST.

Desafortunadamente, lo que intenta hacer no es posible en una aplicación normal de Rails.

(Si realmente lo desea, puede lograrlo escribiendo sus propios ayudantes de formulario y un poco de Javascript para reemplazar la función de envío nativo del navegador. El Javascript entonces construiría esa URL en función de los campos del formulario . me argumentar en contra de ella, sin embargo)

+0

Es perfectamente posible que un formulario HTML para enviar parámetros GET HTTP. Echa un vistazo a la URL cuando buscas en Google, por ejemplo. –

+0

Pero lo que él está tratando de hacer no son los parámetros * query string *, son parte de la ruta de la URL. –

+0

Lo siento, he leído mal la pregunta. –

Cuestiones relacionadas