2010-12-14 10 views
1

In views/products/edit.html.erb ich benutze:Ruby on Rails: Warum "Bearbeiten" Aktion nicht funktioniert?

<%= form_for(:product, :url => {:action => 'update', :id => @product.id}) do |f| %> 

, die erzeugt:

<form method="post" action="/aircons/8" accept-charset="UTF-8"> 

und ich erhalte den folgenden Fehler:

The action '8' could not be found for ProductsController 

, wenn ein Produkt mit id=8 zu aktualisieren versuchen.

Ich denke, dass Forms Methode put sein sollte. Ist das richtig ? Wie soll ich das beheben?


Einige Controller-Code:

def edit 
    @product = Product.find(params[:id]) 
end 

def update 
    update_params_with_new_values(params) 

    @product = Product.find(params[:id]) 

    if @product.update_attributes(params[:product]) 
    flash[:notice] = "Product updated successfully." 
    redirect_to(:product => 'index') 
    else 
    render('edit') 
    end 
end 

def update_params_with_new_values(params) 
    params[:product][:shop_id] = Shop.create(:name => params[:new_shop]).id if params[:product][:shop_id] == "new_shop" 
    params[:product][:brand_id] = Brand.create(:name => params[:new_brand]).id if params[:product][:brand_id] == "new_brand" 
end 

routes.rb enthält nur die beiden folgenden Zeilen:

root :to => "products#index" 
resources :products 

Antwort

6

Warum gehst du nicht einfach verwenden:

<%= form_for @product do |f| %> 

?

Wenn es nicht funktioniert, fügen Sie bitte Ihre Routen zu Frage.

+0

OK. Es funktioniert jetzt :) Aber, immer noch, ist die Methode POST, während nach http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions die Methode für die Aktualisierung PUT sein sollte. Warum der Unterschied? –

+3

Wie ich mich erinnere, unterstützen Browser/Server nur POST- und GET-Methoden. DELETE und PUT erfolgt mit POST. Wenn Sie also ein Formular erstellen, wird in HTML nur POST verwendet, aber zur Form wird ein verstecktes Feld hinzugefügt: 'wodurch Rails die Methode unterscheidet Sie verwenden – klew

+0

Vielen Dank für die tolle Erklärung! –

1

versuchen, diese mit

<% form_for @product %> 
#code goes here 
<% end %> 

Sie müssen nicht alle Dinge tun, die Sie versuchen. Wenn Sie dieses Product Modell Gerüstmechanismus erstellt haben, müssen Sie den Eintrag in der config/routes.rb Datei haben diese geben Ihnen einen Pfadvariablen wie unten

GET  /products/:id/edit  edit return an HTML form for editing a photo 
PUT  /products/:id update update a specific photo 

Sie den Bearbeitungspfad als edit_product_path für weitere Informationen

auf dieser have a look at this bekommen

Hoffe, Sie verstehen es jetzt besser.

+0

können wir einen Blick auf Ihren Controller-Code und auch die Route für diesen bestimmten Controller – Rohit

+0

Ich habe die Frage aktualisiert, danke! –

+0

Der Controller und der Router sehen gut aus. Kein Problem mit diesen Dateien. Nun, ich würde gerne wissen, wie Sie auf die Bearbeitungsseite kommen. Ich meine die Codezeile, die Sie mit der Bearbeitungsseite verbindet. – Rohit