2010-01-30 5 views
6

J'essaie de créer un formulaire de recherche simple dans Rails, mais je pense qu'il me manque quelque chose.Utilisation d'itinéraires nommés avec paramètres et form_tag

J'ai une route nommée pour la recherche:

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

Je suis en train de l'utiliser dans mon formulaire de recherche:

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

Mais quand je charge le formulaire de recherche-je obtenir un 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?

Que manque-t-il? Je pensais que les champs définis dans mon formulaire seraient automatiquement liés à mes paramètres d'itinéraire. : -/

Mise à jour:

Je comprends que search_path est généré avant que le formulaire est affiché maintenant, il ne peut pas être mis à jour. Évident avec le recul!

j'ai changé mes itinéraires:

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

Et maintenant l'action search fait exactement:

def search 
    redirect_to name_path(params) 
end 

Tout fonctionne un régal! L'objectif principal ici était d'obtenir cette URL à partir du nom itinéraire nommé à la suite d'une recherche. Merci les gars!

Répondre

4

form_for génère la forme et il doit avoir spécifié tous les paramètres nécessaires pour créer search_path, il devrait donc ressembler à:.

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

ou au moins quelque chose comme ça. La balise HTML form a le paramètre action='/some/url' et c'est pourquoi vous devez spécifier tous les paramètres pour search_path.Mais l'exemple ci-dessus ne fonctionnera pas comme prévu.

Alors, que pouvez-vous faire?

  1. Créer un formulaire vide qui a action='/' et js le remplacer par le contenu de vos champs de saisie de texte avant de le soumettre.

  2. Créez un autre itinéraire, sur l'exemple /search qui recive les paramètres de submit, puis les redirige vers le chemin correct.

Il y a probablement aussi des meilleures façons de le faire;)

+0

Je viens de le faire travailler avec votre option # 2 - J'ai créé un autre itinéraire et une autre action. Merci! –

+0

Probablement, il serait préférable de le faire dans les deux sens. Donc, faites-le en 2. mode par défaut et si js fonctionne, alors changez 'action' avec js - donc ça peut marcher sans rediriger. – klew

2

Tout d'abord, search_path est en fait une méthode, qui prend un hachage d'options. C'est cette méthode qui devrait recevoir :first_name et :last_name. Deuxièmement, un navigateur peut uniquement soumettre des paramètres de formulaire en tant que corps d'une requête POST ou paramètres de chaîne de requête (pour tout type de méthode de requête). Il n'y a donc malheureusement aucun moyen que la fonction de soumission native d'un navigateur puisse générer ce type d'URL. Une autre façon d'y penser: Ce que vous faites ici est de remplir l'attribut d'action de la balise de formulaire avec une URL. Rails a besoin d'une URL complète lorsque vous créez le formulaire. Tous les paramètres de votre itinéraire doivent donc être spécifiés lors de l'appel de l'assistant de formulaire, plutôt qu'à la demande POST suivante.

Malheureusement, ce que vous essayez de faire n'est pas possible dans une application Rails normale.

(Si vous le souhaitez vraiment, vous pourrez peut-être le faire en écrivant vos propres aides de formulaire et un peu de Javascript pour remplacer la fonction de soumission native du navigateur. . Je dirais contre, si)

+0

Il est tout à fait possible pour un formulaire HTML pour soumettre les paramètres HTTP GET. Jetez un oeil à l'URL lorsque vous effectuez une recherche sur Google, par exemple. –

+0

Mais ce qu'il essaie de faire ne sont pas des * paramètres de chaîne de requête *, ils font partie du chemin de l'URL. –

+0

Désolé, j'ai mal lu la question. –

Questions connexes