2009-05-05 12 views
1

Ich habe ein Formular, das ich benutze, um ein Feld auf einem "Ding" zu aktualisieren und zu aktualisieren, jedoch bekomme ich massive Probleme, die wahrscheinlich auf etwas dummes ist.Probleme mit dem Routing eines Rails form_for

Mein Code ist wie folgt:

<% form_for :thing, :url => { :action => "update" } do |f| %> 
    <%= f.collection_select :status_id, Thing.statuses, :first, :last %> 
    <%= f.submit 'Submit' %> 
<% end %> 

Dies ist für mich korrekt aussieht (@thing BTW existiert), aber wenn ich übermittle ich

Unknown action 
No action responded to 145 

etc etc etc. Die URL erhalten ist http://localhost:3000/things/145. Was mache ich falsch?

Antwort

4

Wenn Sie RESTful Routing wurden mit (und ich nehme an, Sie sind), könnten Sie dies nur tun:

<% form_for @thing do |f| %> 
    <%= f.collection_select :status_id, Thing.statuses, :first, :last %> 
    <%= f.submit 'Submit' %> 
<% end %> 

Und das wird auf die richtige Aktion zeigen, abhängig davon, ob @thing eine new_record? ist oder nicht.

1

ich irgendwie verachten ActionView so bin ich immer rostig, wenn es darauf ankommt, sondern versuche,

<% form_for :thing, :url => 
    url_for(:action => "update", :id => @thing) do |f| %> 

Ich bin sicher, dass jemand anderes mit etwas trockener und sauberen kommen kann.

+0

Irgendwelche Gründe für den ActionView Hass? ;) –

+0

Viele. Könnte eine ganz eigene SO Frage sein. Aber lass uns versuchen, es klein zu halten: Erb saugt, ich mag haml; Ich würde lieber jQuery anstelle von Prototype verwenden, sondern alle generellen Prototypen Code; Ich mag die HTML-Ausgabe der Helfer sowieso nicht; Es ist dumm: Der View-Code kennt die View-Struktur selbst nicht. Zum Beispiel möchte ich, dass ein Formular das Multipart-Attribut automatisch annimmt, wenn ich ein Dateifeld hinzufüge. Kann das nicht tun. (Kann auch nicht in haml, aber ich habe einige erstaunliche vapourware hier, die dies und vieles mehr tut. Hoffentlich eines Tages wird es auf Github enden) – kch

+0

Ich habe mit etwas sauberer aktualisiert. –

4

Mit RESTful-Routen wird die update Aktion ausgelöst, wenn eine put Anfrage erkannt wird. Sie müssen wahrscheinlich nur die Methode als HTML-Option angeben:

form_for :thing, :url => { :action => "update" }, :html => { :method => 'put' } do |f| 
+0

Nicht die ruhige Art, es zu tun, könnte form_for @ thing tun und es würde funktionieren. Viel aufgeräumter. –