Button_to修补程序方法意外起作用

时间:2018-10-11 22:24:20

标签: ruby-on-rails ruby

我整天都在努力使我的button_to工作。这是我的订单索引视图中的代码:

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

我的控制器:

  def update
    @order.products.delete(Product.find(@product.id))
    @product.ordinable = true
    @product.save
    @order.amount = 0
    @order.save
    @order_amountnew = @order.amount
    @order.products.each do |x|
    @order_amountnew = @order_amountnew + x.price
      end
    @order.amount = @order_amountnew
    @order.save
    if @order.products.empty?
      @order.destroy
    end
    redirect_to orders_url
  end

和我的路线:

Rails.application.routes.draw do
  root to: 'pages#home'
  devise_for :users
  resources :products
  resources :orders, only: [:show, :create, :index, :destroy, :update]
  post '/payment', action: :payorder, controller: 'orders'
  patch '/orders', action: :update, controller: 'orders'

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

我试图使用订单索引中的button_helper触发update方法中的代码。我想出了这个解决方案,但出乎意料的是,我的button_to方法现在触发了update方法,但仅在我花了几个小时的时间并将其添加到我的路由中之后,此行代码才会出现:

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

现在我的问题是,每当我想触发一个带有link_to或button_to的方法时,我都必须为每种方法创建一条这样的路由吗?否则,我会得到路由错误吗?我对此有疑问,因为在这里:

resources :orders, only: [:show, :create, :index, :destroy, :update]

我已经为我的订单资源定义了一条更新路线,所以我不明白为什么我需要再次为我要使用的crud方法指定路线。谢谢。

1 个答案:

答案 0 :(得分:1)

  1. resources :orders, only: [:show, :create, :index, :destroy, :update]将产生更新URL为 / orders /:id 。您可以通过拨入rake routes输出来验证这一点。

  2. patch '/orders', action: :update, controller: 'orders'产生的更新URL为 / orders

后者之所以起作用,是因为<%= button_to("Remove", {:controller => "orders", :action => "update", :id => product.id}, :method => :patch) %> / orders?id = ... 发送了一个请求。您可以在stacktrace中验证

如果要使用1,则应将button_to更改为类似于<%= button_to("Remove", product_path(product), :method => :patch) %>的格式。请参阅https://api.rubyonrails.org/v5.2.1/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to以获取参考。

希望有帮助:)。