我整天都在努力使我的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方法指定路线。谢谢。
答案 0 :(得分:1)
resources :orders, only: [:show, :create, :index, :destroy, :update]
将产生更新URL为 / orders /:id 。您可以通过拨入rake routes
输出来验证这一点。
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以获取参考。
希望有帮助:)。