Метод патча Button_to неожиданно работает - PullRequest
0 голосов
/ 12 октября 2018

Я целый день изо всех сил пытался заставить мою кнопку работать.Это код в моем представлении индекса заказа:

<%= 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 внутри моего индекса заказа.Я придумала это решение и неожиданно мой метод button_to теперь вызывает метод обновления, но только после того, как я потратил часы на поиск в Google и добавил к своим маршрутам следующую строку кода:

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

Мой вопрос сейчас, всякий раз, когда яХотите вызвать метод с link_to или button_to, я должен создать маршрут для каждого метода, как это верно?В противном случае я получаю ошибку маршрутизации правильно?У меня есть это сомнение, потому что здесь:

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

Я уже определил маршрут обновления для своего ресурса заказов, поэтому я не понимаю, почему мне нужно снова указать маршрут для метода crud, который я хочу использовать.Спасибо.

1 Ответ

0 голосов
/ 12 октября 2018
  1. resources :orders, only: [:show, :create, :index, :destroy, :update] приведет к обновлению URL как / orders /: id .Вы можете проверить это, вставив rake routes output.

  2. patch '/orders', action: :update, controller: 'orders' приводит к обновлению URL-адреса как / orders .

Причина, по которой последнее работает, заключается в том, что <%= button_to("Remove", {:controller => "orders", :action => "update", :id => product.id}, :method => :patch) %> отправляет запрос на / orders? Id = ... .Вы можете проверить это в трассировке стека

. Если вы хотите использовать 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 для справок.

Надеюсь, это поможет:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...