2011-05-20 23 views
45

Tengo un módulo con una función. Reside en /lib/contact.rb:Cómo acceder al módulo auxiliar de URL desde los rieles

module Contact 
    class << self 
    def run(current_user) 
     ... 
    end 
    end 
end 

Quiero tener acceso a los ayudantes de URL como 'users_path' dentro del módulo. ¿Cómo puedo hacer eso?

+1

posible duplicado de [Can rieles de enrutamiento Ayudantes (es decir MyModel \ _PATH (modelo)) se utilizan en los modelos?] (Http://stackoverflow.com/questions/341143/can-rails-routing-helpers-ie -mmodel-pathmodel-be-used-in-models) –

Respuesta

84

En su módulo, sólo realizar un:

include Rails.application.routes.url_helpers 
+0

¡Gracias, eso fue todo! – sizzle

+0

Placer ... ;-) – ronnieonrails

+2

No funciona para mí ... :(¿Podría dar más detalles, por favor? –

24

Delegación en url_helpers parece mucho mejor que incluyendo todo el módulo en su modelo

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

reference

+0

No funciona para mí tampoco ... :( –

+0

debería ser' url_helpers' no 'url_helper', creo. – davmac

+0

Hola, ¿cómo sabías que era Rails.application.routes that url_helpers debería ser delegado a? ¿Dónde encuentra esta documentación? ¡Gracias! –

23

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 está intentando include url_helpers, asegúrese de estar haciendo eso en el lugar correcto, p. 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 de Carpincho prueba

feature 'bla-bla' do 
    include Rails.application.routes.url_helpers 
    path = some_path #unknown local variable some_path 
end 

y ahora la correcta

include Rails.application.routes.url_helpers 
feature 'bla-bla' do 
    path = some_path #this is ok 
end 
3
delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url => 'www.foo.com/users' 

a Augustin Riedinger, que el código delegación ha de hacer referencia a url_helpers (plural), de lo contrario se obtiene

método no definido `url_helper'

2

He estado luchando con las sutilezas del ayudante se esperaba desde el controlador y la pila predeterminados (default_url_options, etc.) y no quería codificar el host.

Nuestros ayudantes de URL son proporcionados por nuestro módulo ingeniosa, por supuesto:

include Rails.application.routes.url_helpers 

pero incluyen esto como es, y (1) el ayudante se va a buscar a default_url_options, y (2) no lo hará saber sobre el host de la solicitud ni la solicitud.

La parte del host proviene de la instancia del controlador url_options. Por lo tanto, yo paso el contexto regulador en mi anterior módulo, 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 

no podrían ajustarse a todos los casos, pero ha sido útil para mí la hora de implementar una especie de intérprete personalizado.

En ninguna manera:

  • si quieres acceder a las opciones de URL por defecto a la perfección, o el anfitrión de la solicitud, tiene que pasar controlador/solicitud de contexto en
  • si sólo necesita la ruta , sin host, y no le importan las opciones de la url, puede hacer algunos métodos ficticios.
Cuestiones relacionadas