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

Sta*_*ack 5 forms routes insert-update ruby-on-rails-3

我有一个表单来创建广告.

控制器:

  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
Run Code Online (Sandbox Code Playgroud)

我的路线:

resources :adverts
Run Code Online (Sandbox Code Playgroud)

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 %>
Run Code Online (Sandbox Code Playgroud)

我可以创建广告,但我不能更新它.

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 %>
Run Code Online (Sandbox Code Playgroud)

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

$ rake路线:

                       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
Run Code Online (Sandbox Code Playgroud)

我需要帮助.

Mis*_*cha 15

当你更新时,你必须通过传递让Rails知道你要更新哪个对象id.

edit.html.erb变化:

<%= form_for @car, :url => adverts_path do |f| %>
Run Code Online (Sandbox Code Playgroud)

至:

<%= form_for @car, :url => advert_path(@car) do |f| %>
Run Code Online (Sandbox Code Playgroud)

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