ruby on rails - form_tag - Cómo acceder al módulo URL helper from rails
routes rails examples (5)
Aquí es cómo lo hago en cualquier contexto sin include
routes = Rails.application.routes.url_helpers
url = routes.some_path
Eso funciona en cualquier contexto. Si intenta include
url_helpers, asegúrese de hacerlo en el lugar correcto, por ejemplo, esto funciona
module Contact
class << self
include Rails.application.routes.url_helpers
end
end
y esto no funciona
module Contact
include Rails.application.routes.url_helpers
class << self
end
end
Un ejemplo más con las pruebas de Capibara
feature ''bla-bla'' do
include Rails.application.routes.url_helpers
path = some_path #unknown local variable some_path
end
y ahora el correcto
include Rails.application.routes.url_helpers
feature ''bla-bla'' do
path = some_path #this is ok
end
Tengo un módulo con una función. Reside en /lib/contact.rb:
module Contact
class << self
def run(current_user)
...
end
end
end
Quiero acceder a los ayudantes de URL como ''users_path'' dentro del módulo. ¿Cómo puedo hacer eso?
En tu módulo, solo realiza una:
include Rails.application.routes.url_helpers
He estado luchando con las sutilezas que el ayudante espera del controlador y la pila predeterminados ( default_url_options
, etc.) y no quise codificar el host.
Nuestros auxiliares de URL son proporcionados por nuestro ingenioso módulo, por supuesto:
include Rails.application.routes.url_helpers
Pero incluya esto tal como está, y (1) el ayudante buscará default_url_options
, y (2) no sabrá sobre el host de la solicitud ni la solicitud.
La parte del host proviene de las url_options
la instancia del url_options
. Por lo tanto, paso el contexto del controlador a mi módulo anterior, ahora una clase:
class ApplicationController
def do_nifty_things
HasAccessToRoutes.new(self).render
end
end
class HasAccessToRoutes
include Rails.application.routes.url_helpers
delegate :default_url_options, :url_options, to: :@context
def initialize(context)
@context = context
end
def render
nifty_things_url
end
end
Puede que no se ajuste a todos los casos, pero me ha sido útil al implementar un tipo de procesador personalizado.
De cualquier manera:
- si desea acceder a las opciones de url predeterminadas a la perfección, o al host de la solicitud, debe pasar el contexto del controlador / solicitud en
- si solo necesita la ruta, no hay un host, y no le importan las opciones de la url, puede hacer algunos métodos simulados.
La delegación a url_helpers parece mucho mejor que incluir todo el módulo en su modelo
delegate :url_helpers, to: ''Rails.application.routes''
url_helpers.users_url => ''www.foo.com/users''
reference
delegate :url_helpers, to: ''Rails.application.routes''
url_helpers.users_url => ''www.foo.com/users''
para Augustin Riedinger, ese código de delegación necesita referirse a url_helpers (plural), de lo contrario se obtiene
método indefinido `url_helper ''