5

我有一个创建广告的表格。

控制器:

  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

创建.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 %>

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

编辑.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 路线:

                       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

4 回答 4

15

当你更新时,你必须通过传递一个id.

edit.html.erb变化中:

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

到:

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

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

于 2012-11-30T06:10:28.037 回答
4

如果您使用 RESTful 路由,则无需指定 a 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
于 2012-11-30T06:17:30.533 回答
0

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

resources :cars, path: "adverts"

连同 RESTful 路由

<%= form_for @car do |f| %>
于 2016-08-03T10:41:13.490 回答
0

您可能还想确保您的url:路径@form_form.

于 2018-05-17T13:58:35.980 回答