J'ai un module avec une fonction. Il réside dans /lib/contact.rb:
module Contact
class << self
def run(current_user)
...
end
end
end
Je veux accéder aux aides URL comme 'users_path' à l'intérieur du module. Comment je fais ça?
Dans votre module, effectuez simplement:
include Rails.application.routes.url_helpers
La délégation à url_helpers semble bien meilleure que d'inclure le module entier dans votre modèle
delegate :url_helpers, to: 'Rails.application.routes'
url_helpers.users_url => 'www.foo.com/users'
Voici comment je le fais dans n'importe quel contexte sans include
routes = Rails.application.routes.url_helpers
url = routes.some_path
Cela fonctionne dans n'importe quel contexte. Si vous essayez de include
url_helpers - assurez-vous que vous le faites au bon endroit, par exemple cela marche
module Contact
class << self
include Rails.application.routes.url_helpers
end
end
et cela ne fonctionne pas
module Contact
include Rails.application.routes.url_helpers
class << self
end
end
Un autre exemple avec les tests Capybara
feature 'bla-bla' do
include Rails.application.routes.url_helpers
path = some_path #unknown local variable some_path
end
et maintenant la bonne
include Rails.application.routes.url_helpers
feature 'bla-bla' do
path = some_path #this is ok
end
J'ai eu du mal avec les subtilités que l'assistant attend du contrôleur et de la pile par défaut (default_url_options
, etc.) et ne voulait pas coder en dur l'hôte.
Nos assistants URL sont fournis par notre module astucieux, bien sûr:
include Rails.application.routes.url_helpers
Mais incluez-le tel quel et (1) l'assistant va chercher default_url_options
, et (2) ne connaîtra pas l'hôte de la demande ni la demande.
La partie Host vient de l'instance de contrôleur url_options
. Par conséquent, je passe le contexte du contrôleur dans mon ancien module, maintenant une classe:
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
Peut ne pas convenir à tous les cas, mais cela m'a été utile lors de la mise en œuvre d'une sorte de rendu personnalisé.
De quelque manière que:
delegate :url_helpers, to: 'Rails.application.routes'
url_helpers.users_url => 'www.foo.com/users'
à Augustin Riedinger, ce code de délégation doit se référer à url_helpers (pluriel), sinon vous obtenez
méthode non définie `url_helper '