Error de enrutamiento: no hay coincidencias de ruta cuando se usa button_to con acción personalizada

Tengo el siguiente botón para descargar un archivo.

= button_to 'download', action: 'download', method: 'get' 

Y tengo un método de download bajo MoviesController como este

 # movies_controller.rb def download … end 

Sin embargo, me sale el siguiente error. Alguna idea de como resolver esto?

 Routing Error No route matches {:action=>"download", :method=>"get", :controller=>"movies"} 

En tus routes.rb :

 resources :movies do get 'download', on: :member end 

Ahora, en su opinión, debe especificar qué película desea descargar:

 = button_to 'download', download_movie_path(@movie), method: 'get' 

Además, tenga en cuenta:

  1. Use la path lugar de especificar controller/action en los ayudantes.

  2. Use link_to para las solicitudes GET y si necesita un enlace con estilo de botón, aplíquelo a través de CSS. button_to con solicitud GET es una mala práctica.

Intente esto, debería funcionar con su código de vista, solo cambie a route.rb

 resources :movies do get :download, :on => :collection end 

Alternativamente, si desea especificar controlador / acción (lo que tiene ventajas, ya que le permite pasar por parámetros arbitrarios), también deberá pasar explícitamente cualquier parámetro en el que se base la acción (suponiendo que esté intentando descargar un Película individual, y no toda la colección).

 button_to 'download', {controller: 'movies', action: 'download', id: movie.id }, method: 'get' 

También, ditto el punto de Mikhail D sobre el uso de link_to para las solicitudes “obtener”. Definir el método explícitamente es excelente para enviar solicitudes a la acción “actualizar” (configurando el método:: parche o método:: pone), pero para “obtener” solo use link_to.