web-dev-qa-db-fra.com

Comment accéder à l'URL helper à 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 veux accéder aux aides URL comme 'users_path' à l'intérieur du module. Comment je fais ça?

61
sizzle

Dans votre module, effectuez simplement:

 include Rails.application.routes.url_helpers
113
ronnieonrails

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'

référence

27
Naveed

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
25
Anton Chikin

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:

  • si vous souhaitez accéder aux options d'URL par défaut de manière transparente ou à l'hôte de la demande, vous devez passer le contexte contrôleur/demande dans
  • si vous avez juste besoin du chemin, pas d'hôte et que vous ne vous souciez pas des options d'URL, vous pouvez simplement créer des méthodes factices.
5
Jonathan Allard
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 '

3
Jerome