ruby on rails - Rails: genera una URL completa en una vista de ActionMailer
ruby-on-rails host (5)
Estoy usando ActionMailer para enviar un correo electrónico de confirmación de registro. El correo electrónico debe contener un enlace al sitio para verificar al usuario, pero no puedo convencer a Rails para que genere una URL completa (incluido el dominio, etc.)
Estoy usando:
<%= url_for :controller => ''login'', :action => ''verify'', :guid => @user.new_user.guid, :only_path => false, :host => ''http://plantality.com'' %>
en mi vista
Parte B:
En el modo de desarrollo Rails quejas si no especifico la explicabilidad del host en el enlace de arriba. Pero no quiero hacer esto en producción. ¿Alguna solución?
Creo que no es 100% correcto, pero esto también puede ser una solución:
Consulte la sección Uso de hosts de activos en la documentation . Es necesario especificar un asset_host
. También puede construirlo dinámicamente desde el encadenamiento de solicitud "#{request.protocol}#{request.host_with_port}/login/?guid=#{@user.new_user.guid}"
No estoy seguro de si es lo que desea pero en config / environment / development.rb puede especificar las opciones predeterminadas para las direcciones URL de correo.
config.action_mailer.default_url_options = {
:host => "your.host.org",
:port => 3000
}
puedes hacer lo mismo en config / environment / production.rb
No sé por qué las soluciones anteriores parecen tan complicadas, pero como estoy aquí, ¿por qué no doy mis 2 centavos ...
Vaya a /config/environments
y añada:
config.absolute_site_url = ''your site url''
para el entorno respectivo (es decir, en development.rb, test.rb o production.rb). Reiniciar el servidor web.
Esto le permite llamar a Rails.application.config.absolute_site_url
para obtener la URL deseada. No hay necesidad de complementos o trucos extraños, simplemente almacene la URL del sitio como una variable de aplicación amplia.
Para generar url, intente esto
Rails.application.routes.url_helpers.user_url(User.first.id, host: ''yourhost.io'')
esto generará url así:
También puedes pasar algunos params.
expires = Time.now + 2.days
params = {expires: expires}
u = User.first.id
Rails.application.routes.url_helpers.user_url(u, params, host: ''host.com'')
Generará:
http://yourhost.io/users/1.expires=2018-08-12+15%253A52%253A15+%252B0300
para que pueda werifi en acción si el enlace no ha caducado
Para resolver el problema de pasar un host para generar URL en ActionMailer, consulte este complemento y la razón por la que lo escribí .
Para resolver el primer problema, use rutas con nombre cuando corresponda. En lugar de
<%= url_for :controller => ''login'', :action => ''verify'', :guid => @user.new_user.guid, :only_path => false, :host => ''http://plantality.com'' %>
asumiendo que la ruta se llama login
, use
<%= login_url(:guid => @user.new_user.guid) %>
Tenga en cuenta que estoy usando login_url
, no login_path
.