Heroku / devise - Brak hosta do linku! Podaj: parametr hosta lub ustaw default_url_options [: host]

178

Próbuję przekazać moją aplikację na heroku. Nadal pracuję nad programami. Używam devise z potwierdzalnym modułem.

Kiedy próbuję dodać użytkownika za pomocą konsoli heroku, pojawia się ten błąd:

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

w środowisku testowym i deweloperskim mam następującą linię:

environment / development.rb i environment / test.rb

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

Nie ustawiłem czegoś w środowisku produkcyjnym.

Próbowałem naciskać

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

ale to też nie działa.

Widzę w sieci, że może to być powiązane z ActionMailerem, ale nie wiem, co mam skonfigurować. Wielkie dzięki za Twój pomysł!

EDYTOWANO:

Cześć,

Aby nie powodować awarii mojej aplikacji, gdy naciskam na heroku, umieszczam to w moim env / test.rb i moim env / dev.rb (nie w env.rb, myślę, że dzieje się tak, ponieważ jest to aplikacja rails 3)

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

Ale kiedy próbowałem utworzyć użytkownika w konsoli heroku:

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

oto błędy, które otrzymałem:

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'

EDYTOWANE (2)

Kiedy wpisuję logi heroku na konsoli, otrzymuję to ==> production.log <== Więc myślę, że kiedy ktoś wdraża na heroku, jest już w produkcji.

Konfiguruję plik env / prod.rb w ten sposób:

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

a teraz mam to jako błąd, kiedy próbuję utworzyć użytkownika:

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'
benoitr
źródło

Odpowiedzi:

243

Musisz dodać to do swojego environment.rb

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

Upewnij się, że zmienisz hostprodukcyjny adres URL i zachowaj go jako hosta lokalnego na potrzeby programowania. To jest dla poczty, potrzebuje domyślnego adresu e-mail, aby wysyłać powiadomienia, takie jak potwierdzenia itp.


Powinieneś sprawdzić logi na serwerze heroku i heroku logsuruchomić to z konsoli i pokaże ci dokładny błąd.

Kiedy naciskasz na heroku, musisz skonfigurować environment.rbplik z subdomeną heroku:

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

W zależności od wersji powinno to wejść production.rb, a nie environment.rb.

thenengah
źródło
Cześć sam! Przepraszam, ale nie rozumiem. Po prostu dodaję wiersz config.action_mailer.default_url_options = {: host => 'localhost'} w moim pliku env.rb, ale moja aplikacja rails 3 ulega awarii na heroku. Czy musiałem też coś umieścić w pliku env / prod.rb? (przepraszam, mój angielski jest taki taki ...)
benoitr
Czy musiałem też przełączyć aplikację rails w tryb produkcyjny? Dzięki!
benoitr
1
:host => 'yourapp.heroku.com' to powinna być Twoja domena. Na przykład, jeśli Twoja domena to yahoo.com, powinna tak być yahoo.heroku.comlub jeśli już skonfigurowałeś domeny niestandardowe, będzie to po prostu Twój adres URLyahoo.com
toengah
1
Dzięki Sam, znajduję rozwiązanie. Faktem jest, że nie miałem dodatku sendgrid, a mój smtp nie został skonfigurowany. Wielkie dzięki za całą twoją kopię zapasową!
benoitr,
1
Czy nie będzie config.action_mailer.default_url_options = { :host => 'yourapp.herokuapp.com', w przeciwieństwie do sprawiedliwego config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com'?
maudulus
37

Dobrze,

Najpierw musisz zainstalować gem sendgrid za pomocą tego wiersza poleceń:

heroku addons:add sendgrid:free

Następnie wystarczy skonfigurować pliki env / dev.rb i env / prod.rb w następujący sposób:

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' }

Wciśnij git i heroku. Powinno działać ..

benoitr
źródło
Otrzymuję ten błąd, gdy odwołuję się do config.action_mailer w production.rb: /app/.bundle/gems/ruby/1.9.1/gems/railties-3.0.7/lib/ rails / railtie / configuration.rb: 77: in method_missing': undefined method action_mailer 'dla # <Rails:: Application :: Configuration: 0x0000000241f760> (NoMethodError)
Laran Evans
Nie jestem pewien, czy mogę w tym pomóc ... Czy odwołałeś się do tego w bloku? (Website :: Application.configure do ... config.action_mailer.default_url_options = {: host => 'yourapp.heroku.com'} ... end)
benoitr
6
teraz polecenie sendgrid to heroku addons: add sendgrid: starter (zobacz szczegóły użycia na devcenter.heroku.com/articles/sendgrid )
Danny
24

Powyższa odpowiedź Codeglot spełnia swoje zadanie, ale chcieliśmy czegoś bardziej elastycznego, więc zrobiliśmy to:

W Heroku uruchamiamy wiele środowisk produkcyjnych do testowania i testowania, więc potrzebujemy elastycznego rozwiązania dla pliku środowiska production.rb.

W produkcji.rb

config.action_mailer.default_url_options = { :host => ENV['MAILER_URL'] }

Następnie ustaw zmienną środowiskową MAILER_URL dla swojej aplikacji w ten sposób

heroku config:set MAILER_URL=my-awesome-app.herokuapp.com --app my-awesome-app
Ross
źródło
18

Jeśli biegasz na Cedar :

  1. uruchomić heroku addons:add sendgrid:freez konsoli.

  2. Dodaj następujące wiersze do config/environments/production.rbw swojej aplikacji.

.

  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' }
Mikrofon
źródło
13

Musiałem zrobić kilka rzeczy, aby działał w środowisku produkcyjnym : Wewnątrz mojego production.rbpliku (/config/environments/production.rb) dodałem:

Rails.application.routes.default_url_options[:host] = 'myappsname.herokuapp.com'
config.action_mailer.delivery_method = :smtp
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = false
config.action_mailer.default :charset => "utf-8"

Dotyczy to Rails 4 i Devise 3

maudulus
źródło
1
Ta struktura default_url_optionsspowodowała błąd, który spowodował, że moje zasoby prekompilacji zawiodły, po prostu fyi. Kiedy zmieniłem go z powrotem na `= {host: 'myappsname.herokuapp.com'}` działało.
Liz,
0

Pracujący po tylu badaniach,

  1. Nie zapomnij dodać domyślnego adresu od: w swoim ApplicationMailer (application_mailer.rb) jako,

    class ApplicationMailer < ActionMailer::Base
      default from: '[email protected]'
      layout 'mailer'
    end
  2. Dodaj poniższą konfigurację do pliku production.rb .

    config.action_mailer.default_url_options = 
      { :host => 'yourapp.herokuapp.com' }
    config.action_mailer.delivery_method = :smtp
    config.action_mailer.smtp_settings = {
      address:              'smtp.gmail.com',
      port:                 587,
      domain:               'heroku.com',
      user_name:            '[email protected]',
      password:             'yourgmailpassword',
      authentication:       'login',
      enable_starttls_auto: true
    }
  3. Włącz protokół IMAP w ustawieniach Gmaila na karcie Przekazywanie IMAP / POP .

  4. Pozostawić mniej bezpieczne aplikacje: on z https://myaccount.google.com/lesssecureapps

Teraz możesz już iść. :)

Anshab MK
źródło