在rails中更新表单 - 没有路由匹配[PUT]

时间:2012-11-30 06:00:39

标签: ruby-on-rails-3 forms routes insert-update

我有一个表单来制作广告。

控制器:

  def edit
    @engines = Engine.all
    @car = Car.find(params[:id])
  end

  def update
    @car = Car.find(params[:id])

    if @car.save
      redirect_to root_path
    end
  end

我的路线:

resources :adverts

Create.html.erb

<%= form_for @car, :url => adverts_path do |f| %>

  <div><%= f.label :name %><br />
  <%= f.text_field :name %></div>

  <%= hidden_field_tag :model_id, params[:model_id] %>

  <%= select_tag :engine_id, options_from_collection_for_select(@engines, "id", "name",:selected=>@car.engine_id) %>

  <div><%= f.submit "Create car!" %></div>
<% end %>

我可以制作广告,但我无法更新广告。

edit.html.erb

<%= form_for @car, :url => adverts_path do |f| %>

  <div><%= f.label :name %><br />
  <%= f.text_field :name %></div>

  <%= hidden_field_tag :model_id, params[:model_id] %>

  <%= select_tag :engine_id, options_from_collection_for_select(@engines, "id", "name",:selected=>@car.engine_id) %>

  <div><%= f.submit "Update car!" %></div>
<% end %>

当我提交表单时,我有一个错误 - 没有路由匹配[PUT]“/ adverts”

$ rake routes:

                       adverts GET    /adverts(.:format)                     adverts#index
                               POST   /adverts(.:format)                     adverts#create
                    new_advert GET    /adverts/new(.:format)                 adverts#new
                   edit_advert GET    /adverts/:id/edit(.:format)            adverts#edit
                        advert GET    /adverts/:id(.:format)                 adverts#show
                               PUT    /adverts/:id(.:format)                 adverts#update
                               DELETE /adverts/:id(.:format)                 adverts#destroy

我需要帮助。

4 个答案:

答案 0 :(得分:15)

当您进行更新时,您必须通过传递id让Rails知道您要更新的对象。

edit.html.erb更改:

<%= form_for @car, :url => adverts_path do |f| %>

为:

<%= form_for @car, :url => advert_path(@car) do |f| %>

顺便说一句,我觉得你的代码很奇怪。为什么您的型号名称与您的控制器和路线不匹配?我的意思是你正在创建一个广告,但你的模型叫做汽车。这没有任何意义。无论是汽车还是广告,都不要混用它们。

答案 1 :(得分:4)

如果您使用RESTful路由,则无需指定url,只需要:

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

表单可以知道@car是新记录,还是保存记录,因此它会发送相应的http方法。

在您的更新操作中:

def update
  @car = Car.find(params[:id])

  if @car.update_attributes(params[:car])
    redirect_to root_path
  end
end

答案 2 :(得分:0)

今天我遇到了类似情况,资源和型号名称不匹配。我同意模型和控制器名称需要关联,但您可以将路由名称覆盖为您想要的任何名称。

resources :cars, path: "adverts"

与RESTful路由一起

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

答案 3 :(得分:0)

您可能还想确保url:上的@form_form路径单数