74 votes

Comment accéder à l'assistant d'URL à partir du module rails

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 souhaite accéder aux assistants d'URL tels que "users_path" à l'intérieur du module. Comment je fais ça?

133voto

ronnieonrails Points 1959

Dans votre module, effectuez simplement un :

  include Rails.application.routes.url_helpers

31voto

Anton Chikin Points 657

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 de le faire au bon endroit, par exemple cela fonctionne

 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

30voto

Naveed Points 4948

La délégation à url_helpers semble bien meilleure que d'inclure l'ensemble du module dans votre modèle

 delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'

référence

3voto

Jerome Points 342
delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'

à Augustin Riedinger, ce code de délégation doit faire référence à url_helpers (pluriel), sinon vous obtenez

méthode non définie 'url_helper'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X