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
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? –
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
Vielen Dank für die tolle Erklärung! –