首页 > 解决方案 > Button_to 指向的补丁/更新方法不起作用

问题描述

我想要做的是一个 button_to 指向我的控制器内的补丁(更新?),但它不起作用。这是我的代码。

        <div>
    <%= product.picture? ? image_tag(product.picture_url, :alt => product.name) : image_tag("https://via.placeholder.com/250x250") %>
    Product: <%= product.name %><br />
    Description: <%= product.description %><br />
    Price: <%= humanized_money_with_symbol(product.price) %><br />
    Venduto da: <%= product.user.email %><br />
    <%= button_to "Remove", {controller: "orders", action: 'remove', :id => product.id}, :method=>:patch %>
    </div>

在更新方法中,假设我迟早让它工作,我应该插入一个逻辑来从订单本身中删除产品。目前,如果我进入 index.html.erb 中的查看页面,其中包含添加的相关产品中要支付的订单列表。在我的情况下,订单是一种购物车。我收到此错误:

没有路线匹配 {:action=>"remove", :controller=>"orders", :id=>456}

这些是我的路线:

    Rails.application.routes.draw do
  root to: 'pages#home'
  devise_for :users
  resources :products
  resources :orders, only: [:show, :create, :index, :destroy, :patch]

  require "sidekiq/web"
  authenticate :user, lambda { |u| u.admin } do
    mount Sidekiq::Web => '/sidekiq'
  end
end

如您所见,我添加了 :patch 路由,但它仍然不起作用。我认为问题首先在我的路线中......我现在有一些问题。1:如果我想创建一个 link_to 或一个 button_to 助手来执行与常见 crud 操作不同的方法,我是否必须创建到该自定义方法的路由?你能举个例子吗?2:就我而言,我是在发布帖子、获取请求还是补丁?(我正在尝试使用补丁,因为我正在更新我的订单,所以我想我应该在哪里插入逻辑以删除订单中的产品)rails 的文档很棒但是关于路由,我很困惑目前,一旦我想从模式中做点什么,我就会陷入困境,试图让它发挥作用。3:有人可以将我链接到带有示例的好指南以了解路由吗?谢谢你。

更新我找到了解决方案:

<%= button_to("Remove", {:controller => "orders", :action => "update", :id => product.id}, :method => :patch) %>

我在路线中添加了这个:

  patch '/orders', action: :update, controller: 'orders'

现在它起作用了,但我仍然怀疑它为什么起作用:/

标签: ruby-on-railsruby

解决方案


简要说明:更改action: 'remove'action: 'destroy'

大多数浏览器只支持GETPOSTOPTION ,但所有其他方法都由 Rails 使用隐藏的表单字段_method模拟。

当你说method: 'patch'这意味着request.method在你的控制器的方法中它会是patch但是如果你想在控制器中指定你应该使用的确切方法action

希望这会有所帮助:)


推荐阅读