2010-01-30 10 views
6

Ich versuche, ein einfaches Suchformular in Rails zu erstellen, aber ich denke, dass ich etwas vermisse.Verwenden von benannten Routen mit Parametern und form_tag

Ich habe eine benannte Route für die Suche:

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

Ich versuche, dass in meiner Suchformular zu verwenden:

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

Aber als ich das Suchformular laden erhalte ich eine Action :: RoutingError:

Was vermisse ich? Ich dachte, die in meinem Formular definierten Felder würden automatisch mit meinen Routenparametern verknüpft. : -/

Update:

Ich verstehe, dass search_path erzeugt wird, bevor das Formular nun angezeigt wird, so kann es nicht aktualisiert werden. Im Nachhinein offensichtlich!

änderte ich meine Routen:

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

Und nun die search Aktion gerade tut:

def search 
    redirect_to name_path(params) 
end 

Alles eine Behandlung funktioniert! Das Hauptziel hier war, diese URL von der namens genannten Route als Ergebnis einer Suche zu bekommen. Danke Leute!

Antwort

4

form_for erzeugt Form und es muss alle Parameter festgelegt haben, die erforderlich sind search_path zu schaffen, so sollte es so aussehen:.

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

oder zumindest etwas so was. HTML-Tag form hat Parameter action='/some/url' und deshalb müssen Sie alle Parameter für search_path angeben.Aber das obige Beispiel wird nicht wie erwartet funktionieren.

Was können Sie also tun?

  1. leeres Formular erstellen, die vor dem Absenden action='/' und mit js ersetzen Sie es mit Inhalt Ihrer Eingabetextfelder hat.

  2. Erstellen Sie eine andere Route, z. B. /search, die Parameter von submit erhält und dann zum richtigen Pfad weiterleitet.

Wahrscheinlich gibt es auch einige besseren Möglichkeiten, es zu tun;)

+0

Ich habe es gerade mit Ihrer Option # 2 - Ich habe eine andere Route und eine andere Aktion erstellt. Vielen Dank! –

+0

Wahrscheinlich wäre es besser, beides zu tun. Also mach es 2. als Standard und wenn js funktioniert dann ändere 'action' mit js - so kann es ohne Umleiten funktionieren. – klew

2

Erstens ist search_path eigentlich eine Methode, die einen Hash der Optionen nimmt. Es ist diese Methode, die :first_name und :last_name erhalten sollte.

Zweitens kann ein Browser Formularparameter nur als Hauptteil einer POST-Anfrage senden, oder als Abfragezeichenfolge Parameter (für jede Art von Anfrage-Methode). Es gibt also leider keine Möglichkeit, dass eine native Submit-Funktion eines Browsers diese Art von URL generieren kann.

Eine andere Art zu denken: Was Sie hier tun, füllt das Aktionsattribut des Formular-Tags mit einer URL. Rails benötigt beim Erstellen des Formulars eine vollständige URL. Daher müssen alle Parameter in Ihrer Route angegeben werden, wenn der Formularhelfer aufgerufen wird, und nicht bei der nächsten POST-Anforderung.

Also, was Sie versuchen, ist in einer normalen Rails-Anwendung leider nicht möglich.

(Wenn Sie wirklich wollen, können Sie es vielleicht durch Schreiben Ihrer eigenen Formularhelfer und ein wenig Javascript abziehen, um die native Submit-Funktion des Browsers zu ersetzen. Das Javascript würde dann diese URL basierend auf den Formularfeldern erstellen . obwohl ich würde dagegen argumentieren,)

+0

Es ist durchaus möglich, dass ein HTML-Formular HTTP Parameter GET einzureichen. Sehen Sie sich zum Beispiel bei der Suche nach Google die URL an. –

+0

Aber was er zu tun versucht, sind keine * query string * -Parameter, sie sind Teil des Pfades der URL. –

+0

Entschuldigung, ich habe die Frage falsch gelesen. –

Verwandte Themen