Кнопка Rails вызывает метод контроллера и не перенаправляет

#ruby-on-rails #ruby #erb #rails-routing

#ruby-on-rails #ruby #ошибка #рельсы-маршрутизация

Вопрос:

Я пытаюсь вызвать метод в контроллере с кнопки в представлении Rails. Я следил за некоторыми другими вопросами здесь и добрался до этого момента.

routes.rb :

 namespace :processing do
  resources :applications do
    stuff
    post :test, :to => 'applications#test', :on => :member
  end
end
  

метод контроллера просто вызывается test . Вот соответствующая часть контроллера:

 def test
  @application = Application.find_by(record_id: params[:id])
  puts 'THIS IS A TEST'
end
  

Наконец, я вызываю маршрут с этим кодом в .erb файле:

 <%= button_to 'Send to Processing', 
      test_processing_application_path(record_id), 
      method: :post, form_class: 'btn btn-danger' %>
  

Кнопка отображается правильно и, похоже, следует по правильному маршруту. Однако моя проблема в том, что кнопка пытается перенаправить и отобразить маршрут
/processing/applications/715707082/test который не существует и вызывает проблему.

Как мне просто заставить эту кнопку не перенаправлять / отображать что-либо, а вместо этого просто вызвать метод со страницы, на которой он находится в данный момент? Пожалуйста, не стесняйтесь ссылаться на соответствующие сообщения или закрывать это, если оно дублирует существующий вопрос.

Ответ №1:

Маршрут в вашем файле routes.rb определяет

test_processing_application_path в качестве POST пути

/processing/applications/:id/test(.:format)

ожидается, что он будет реализован в контроллере

processing/applications#test

это файл в app/controllers/processing/applications_controller.rb , который определяет контроллер, подобный:

 module Processing
  class Applications < ApplicationController
    def test
      # your code here
    end
  end
end
  

Ответ №2:

Вместо использования метода вы должны использовать action, а remote true запустит запрос ajax и предотвратит перенаправление. Затем создайте файл test.js.erb для обработки запроса ajax на обновление вашего DOM, который будет выполнен после вашего вызова action.

 <%= button_to 'Send to Processing',test_processing_application_path(record_id), 
action: :test, form_class: 'btn btn-danger', :remote=>true %>
  

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

Приветствия.