2012-02-15 13 views
14

Necesito usar el método root_url desde un método definido en un archivo en la carpeta lib. ¿Es eso posible?¿Cómo usar un método de ayuda de ruta desde un archivo en el directorio lib?

he intentado incluir esta línea en mi clase:

include Rails.application.routes.url_helpers 

pero esto me da el error

Falta de acogida para vincular a! Sírvanse proporcionar: parámetro host o conjunto default_url_options [: host]


Editar: descubrí que funciona si primero inicializar la rutas:

def initialize_routes 
    if Rails.env.development? || Rails.env.test? 
    Rails.application.routes.default_url_options[:host] = 'localhost:3000' 
    elsif Rails.env.production? 
    Rails.application.routes.default_url_options[:host] = 'example.com' 
    end 
end 

¿Hay una mejor manera ¿para lograr esto? ¿Tal vez configurar las rutas en un archivo de configuración?

+0

Esta respuesta realmente me ayudó: http://stackoverflow.com/a/16728549/2639304 –

Respuesta

11

Debe haber un par de soluciones para esto.

1) al usar root_url pase en el parámetro de host como:

root_url(:host => 'localhost') 

Eso tendría que ser hecho para ser entorno específico sin embargo.

2) También debe ser capaz de establecer las rutas como default_url_options:

Rails.application.routes.default_url_options[:host]= 'localhost:3000' 

3) Dentro de los archivos de configuración de entorno se deben establecer los default_url_options como se indica en el error. Por ejemplo:

En config/environments/development.rb:

config.action_mailer.default_url_options[:host] = 'localhost' 

En config/environments/test.rb:

config.action_mailer.default_url_options[:host] = 'localhost' 

En config/environments/production.rb:

config.action_mailer.default_url_options[:host] = 'production.com' 
+0

# 1 y # 2 funcionan muy bien. Aunque el # 3 no. # 2 suena como la mejor solución. Dejaré la respuesta abierta para ver si alguien sabe cómo configurar esto desde los archivos de configuración. ¡Gracias por tu ayuda! – alf

28

@ solución # 3 de JDutil, como se ha mencionado en los comentarios, es configurar el correo de acción y no las rutas del enrutador. Sin embargo, en la configuración se puede realizar lo siguiente:

En config/environments/development.rb y config/environments/test.rb:

MyApp::Application.configure do 
    # other configuration ... 
    config.after_initialize do 
    Rails.application.routes.default_url_options[:host] = 'localhost:3000' 
    end 
end 
+0

Esto realmente funcionó. ¡Gracias! – alf

+0

¡Gracias! Funcionó para mí también. –

+3

'Rails.application.routes.default_url_options = Rails.application.config.action_mailer.default_url_options' tal vez incluso –

6

Si usted está confiando en url_helpers para algo así como ActiveModel::Serializers (., Al menos, la v0.9 * serie), donde generará URLs fuera del flujo de solicitud/respuesta de Rails principal, también deberá configurar el Rails.application.routes.default_url_options. Lo he hecho como tal,

# config/application.rb 

config.after_initialize do 
    Rails.application.routes.default_url_options = config.action_mailer.default_url_options 
end 

Los ayudantes de URL se encuentra disponible, con una serie predeterminada, en lugares como trabajos en segundo plano, etc ...

+0

Señalar a las' default_url_options' existentes es genial en este caso. Soluciona el problema para todos mis entornos. – counterbeing

0

Tuve este mismo problema y ninguna de las sugerencias de configuración funcionó. Lo que me dejó confundido es que url_helpers funciona bien desde otras partes de la aplicación (específicamente ayudantes). Así que no debería tener que insertar una nueva configuración para poder usarlos en otro lugar.

Mi solución al final de la jornada fue para hacer esto:

Rails.application.routes.url_helpers.athlete_url(athlete) 

lo que sospecho, aunque no puedo probarlo, es que la inclusión de los ayudantes URL de forma manual con:

include Rails.application.routes.url_helpers 

en realidad causa que se ejecute algún bloque included. Al hacerlo, cambia la configuración desde debajo del código tratando de usarlo. Al no incluir, sino al referirse a él directamente, los bloques 'incluidos' no se vuelven a ejecutar.

Me encantaría saber si alguien puede explicar si estoy en el camino correcto o simplemente haciendo suposiciones falsas.

En resumidas cuentas, refiriéndose a los url_helpers con la ruta completa de módulo/clase, se hizo el trabajo.

Cuestiones relacionadas