【问题标题】:Update form in rails - No route matches [PUT]Rails 中的更新表格 - 没有路线匹配 [PUT]
【发布时间】:2012-11-30 06:00:38
【问题描述】:

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

控制器:

  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 %>

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

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 %>

提交表单时出现错误 - No route matches [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

我需要帮助。

【问题讨论】:

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


    【解决方案1】:

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

    edit.html.erb更改:

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

    到:

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

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

    【讨论】:

    • 试过了,例如 - 没有路线匹配 [PUT] "/adverts.38"
    • @StackStack,如果你尝试advert_path(@car)而不是adverts_path(@car),它会起作用吗?
    • 我有一个前端,它使用 Cars 控制器来显示汽车。现在我创建了一个广告控制器来保存、编辑和显示私人用户汽车。
    • @Stack,很高兴它有效。另请查看 Kien Thanh 的答案,因为您的更新操作不会保存任何更改。
    • @orrymr 因为这是 Rails 在使用 resources 时生成的帮助程序。这是有道理的,因为您更新的是单个广告,而不是多个。当您运行 rake routes 时,您可以看到哪些 _path_url 助手可用。
    【解决方案2】:

    如果你使用 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
    

    【讨论】:

    • 是的,这就是他应该做的。 (请参阅我答案底部的备注。)但是由于CarAdvert 之间的差异,这将不起作用。这将对不存在的cars/:id 发出一个put 请求。
    • @Mischa 是的,我看到了,但我仍然认为他应该使用update_attributes 而不是save :)
    • 哦,是的,你是对的。使用他当前的控制器代码,根本不会保存任何更改。我错过了。 +1
    • 我认为在 Rails 4 中应该是 &lt;%= form_for @car do |f| %&gt; 而不是 &lt;%= form_for @car |f| %&gt;API
    【解决方案3】:

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

    resources :cars, path: "adverts"
    

    与 RESTful 路由一起

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 2012-10-11
        • 2017-07-13
        • 1970-01-01
        相关资源
        最近更新 更多