2011-12-15 12 views
19

En mi Ruby on Rails 3.1 aplicación tengo un enlace como este:Cómo establecer root_url

<%= link_to 'Home', root_url %> 

en mi prog. máquina, hace un enlace con "localhost: 3000". En producción, muestra un enlace con una dirección IP como esta "83.112.12.27:8080". Me gustaría forzar los rieles para representar la dirección del dominio en lugar de la dirección IP. ¿Cómo puedo configurar root_url?

Respuesta

12

En sus rutas establecidas:

root :to => 'welcome#index' 

y en sus enlaces SET:

<%=link_to "Home", root_path %> 

va a proporcionar

<a href="/">Home</a> 

Así que en su localhost Sería lo lleve a

http://localhost:3000/

y en el servidor de producción Se te llevaría a

http://yourdomian.com/

y la routes.rb hará que la acción del controlador indexwelcome por defecto.

PS. también necesita eliminar index.html del directorio public para usar esto.


ACTUALIZACIÓN

Un poco más en el enrutamiento:

Rails Routing from the Outside In

+0

Y siempre lo llevará a '/' sin importar si está en su servidor o en su servidor local. –

+0

Hm. Eso funciono. GRACIAS. Eso es interesante. root_url representa en el servidor la dirección IP. Pero root_path representa la dirección del dominio. –

+1

Las rutas con el prefijo '_path' son relativas, no les importa su dirección IP, dominio o puerto. –

0

Tal vez usted podría hacer algo como esto en su ApplicationController:

class ApplicationController < ActionController::Base 
    helper_method :home_uri 

    def home_uri 
    Rails.env.production? ? 'http://www.yourdomain.com' : root_url 
    end 
    ... 
end 

Y a continuación, cambiar su enlace por qué ser así: <%= link_to 'Home', home_uri %>

Esto hace que un método de ayuda, home_uri, que devuelve la url lo deseaba si la aplicación se ejecuta en el entorno de desarrollo. No creo que pueda sobrescribir fácilmente root_url, y también creo que es una mala idea. Hice que el método auxiliar finalice con uri en lugar de url porque rails usa el enrutador para crear automáticamente métodos que terminan en url, por lo que si tenía una ruta llamada home, esta solución no sobrescribirá ni entrará en conflicto con el método llamado route helper. You can read more about named route helper methods here if you're interested.

+3

Sí.Yo podría hacer eso. Pero ese no es el propósito de "root_url". ¿No hay forma de definir "root_url" para diferentes entornos? Me gustaría definir root_url en development.rb y production.rb. –

35

Usted está buscando ActionController's default url option. Entonces puede hacer algo como:

class ApplicationController < ActionController::Base 
    def default_url_options 
    if Rails.env.production? 
     {:host => "www.example.com"} 
    else 
     {} 
    end 
    end 
end 

Esto también funciona para ActionMailer. Además, ambos se pueden establecer en su entorno .rb o application.rb

# default host for mailer 
config.action_mailer.default_url_options = { 
    host: 'example.com', protocol: 'https://' 
} 

# default host for controllers 
config.action_controller.default_url_options = { 
    :host => "www.example.com" 
} 
+1

sí. Eso es más o menos lo que estoy buscando. GRACIAS. –

+5

Gracias. funcionó para mí. Pero preferí hacerlo en 'application.rb' y agregué un' config.action_controller.default_url_options = {: host => "justinbiebiersucks.com"} ' –

+1

Sí, la aplicación.rb es un lugar más apropiado. No recuerdo por qué lo he sugerido de esa manera. Y a propósito el dominio de ejemplo;) – lucapette

Cuestiones relacionadas