Ruby on Rails: почему действие «редактировать» не работает? - PullRequest
1 голос
/ 14 декабря 2010

В views/products/edit.html.erb Я использую:

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

, который генерирует:

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

, и я получаю следующую ошибку:

The action '8' could not be found for ProductsController

при попыткеобновить продукт с id=8.

Я думаю, что метод формы должен быть put.Это правильно ?Как это исправить?


Какой-то код контроллера:

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 содержит только следующие две строки:

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

Ответы [ 2 ]

6 голосов
/ 14 декабря 2010

Почему бы вам просто не использовать:

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

?

Если это не сработает, пожалуйста, добавьте ваши маршруты к вопросу.

1 голос
/ 14 декабря 2010

попробуйте использовать это

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

вам не нужно делать все то, что вы пытаетесь. Если вы создали эту модель Product с использованием механизма скаффолдинга, у вас должна быть запись в файле config/routes.rb, которая даст вам переменную пути, как показано ниже

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

Вы можете получить путь редактирования как edit_product_path для получения дополнительной информации об этом посмотрите на это

Надеюсь, теперь вы понимаете это лучше.

...