[ruby-on-rails] Heroku / Devise - Manca host per il collegamento a! Fornire: parametro host o set default_url_options



Answers

Ok,

Per prima cosa devi installare la gemma sendgrid con questa riga di comando:

heroku addons:add sendgrid:free

Quindi devi solo configurare env / dev.rb e env / prod.rb in questo modo:

ENV / dev.rb

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

ENV / prod.rb

config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' }

Spingi su git e heroku. Dovrebbe funzionare..

Question

Sto cercando di spingere la mia app su heroku. Sono ancora in sviluppo. Io uso inventare con il modulo confermabile.

Quando provo ad aggiungere un utente con la console heroku, ho ricevuto questo errore:

Missing host to link to! Please provide :host parameter or set default_url_options[:host]

in ambiente test e dev ho la seguente riga:

ambienti / development.rb e ambienti / test.rb

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

Non ho impostato qualcosa nell'ambiente di produzione.

Ho provato a spingere con

config.action_mailer.default_url_options = { :host => 'mywebsitename.com' }
config.action_mailer.default_url_options = { :host => 'heroku.mywebsitename.com' }

ma non funziona anche ..

Vedo sul Web che potrebbe essere correlato a ActionMailer ma non so cosa devo configurare. Mille grazie per la tua idea!

MODIFICATO:

Ciao,

Per non far crashare la mia app quando spingo su heroku, la metto nel mio env / test.rb e nel mio env / dev.rb (non in env.rb penso che sia perché è un'app per rails 3)

config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' }

Ma quando ho provato a creare un utente nella console di heroku:

User.create(:username => "test", :email => "test@test.com", :password => "test1234", :password_confirmation => "test1234", :confirmed_at => "2010-11-03 14:11:15.520128")

ecco gli errori che ho ricevuto:

ActionView::Template::Error: Missing host to link to! Please provide :host parameter or set default_url_options[:host]
/home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/route_set.rb:473:in `url_for'
/home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/url_for.rb:132:in `url_for'
/home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_view/helpers/url_helper.rb:99:in `url_for'
/home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/route_set.rb:195:in `user_confirmation_url'

MODIFICATO (2)

Quando digito i registri di heroku su console, ho ottenuto questo ==> production.log <== Quindi penso che quando si esegue il deploy su heroku è già in produzione.

Configuro env / prod.rb in questo modo:

config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' }

e ora ho questo come errore quando provo a creare un utente:

Errno::EAFNOSUPPORT: Address family not supported by protocol - socket(2)
/usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `initialize'
/usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `open'
/usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `do_start'
/usr/ruby1.8.7/lib/ruby/1.8/timeout.rb:62:in `timeout'



Se corri su Cedar :

  1. eseguire i heroku addons:add sendgrid:free dalla tua console.

  2. Aggiungi le seguenti linee a config/environments/production.rb nella tua app.

.

  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com'
  }

  ActionMailer::Base.delivery_method = :smtp

  config.action_mailer.default_url_options = { :host => 'YOUR-DOMAIN-HERE.COM' }



Ecco un trucco da considerare. Rende più semplice cambiare server e ambiente e cambiare dominio come in un dominio personalizzato su heroku.

Invece di codificare il nome host, leggerlo dalla richiesta. Ecco un esempio di una semplice app che ho.

class MyMailController < ApplicationController
  before_filter :set_host_from_request, only: [:create]

  ....   

  private
  def set_host_from_request
    ActionMailer::Base.default_url_options = { host: request.host_with_port }
  end
end

nel semplice esempio ho una sola azione, create, che comporta l'invio di e-mail. È possibile aggiungere il before_filter in application_controller.rb senza gli esclusi per fare in modo che memorizzi sempre il nome host.

PRO:

  • ottieni sempre il nome host corretto nell'URL delle email che invii
  • Avere le opzioni default_url_options nel nostro server di staging configurato per la produzione , ha comportato l'invio di e-mail per testare gli utenti con link alla produzione (cliccandoli ovviamente). Nessun danno, ma richiede molto tempo.

CON:

senza default_url_options non è possibile inviare manualmente nella console

#config.action_mailer.default_url_options = { :host => 'mydomain.com' }
$rails console
  User.invite!(email: "ceo@example.com")
ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
...stacktrace

Se puoi vedere degli inconvenienti che non posso, per favore condividi! Grazie






Links