当我尝试在生产中为我的应用注册新用户时出现以下错误。我已经阅读了所有其他具有相同错误的stackoverflow问题,并且我已经尝试了所有解决方案,但到目前为止它们都没有对我有用。
错误:
ActionView::Template::Error (Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true):
我在我的production.rb文件中使用自己的应用名称正确设置了此代码:
config.action_mailer.default_url_options = { host: 'myapp.herokuapp.com' }
这是完整的production.rb文件:
Blocipedia::Application.configure do
# Settings specified here will take precedence over those in config/application.rb.
config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_assets = false
config.assets.js_compressor = :uglifier
config.assets.compile = false
config.assets.digest = true
config.assets.version = '1.0'
config.log_level = :info
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
config.action_mailer.default_url_options = { host: 'myapp.herokuapp.com' }
end
我仔细检查过我将Sendgrid配置为Heroku中的附加组件。我的密钥和密码都是正确的。
任何建议都将不胜感激!谢谢!
编辑:我正在使用Devise进行用户身份验证。我不确定该错误所指的邮件模板文件究竟是哪个文件,但我猜测它是新的注册视图,然后是与之关联的邮件程序确认说明视图这个错误,是吗?他们在这里:
新注册视图:
<h2>Sign up</h2>
<div class="row">
<div class="col-md-8">
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, autofocus: true, class: 'form-control', placeholder: "Enter name" %>
</div>
<div class="form-group">
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control', placeholder: "Enter email" %>
</div>
<div class="form-group">
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control', placeholder: "Enter password" %>
</div>
<div class="form-group">
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, class: 'form-control', placeholder: "Enter password confirmation" %>
</div>
<div class="form-group">
<%= f.submit "Sign up", class: 'btn btn-success' %>
</div>
<div class="form-group">
<%= render "devise/shared/links" %>
</div>
<% end %>
</div>
</div>
和确认说明查看:
<p>Welcome <%= @email %>!</p>
<p>You can confirm your account email through the link below:</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
以下是整个错误跟踪日志:
Rendered devise/registrations/new.html.erb within layouts/application (3.3ms)
2014-09-24T23:38:38.136606+00:00 heroku[router]: at=info method=GET path="/users/sign_up" host=blocipedia.herokuapp.com request_id=f52c96a7-014c-4667-b1b3-93e8b47e4364 fwd="70.197.237.94" dyno=web.1 connect=2ms service=12ms status=304 bytes=850
2014-09-24T23:38:48.250414+00:00 app[web.1]: Started POST "/users" for 70.197.237.94 at 2014-09-24 23:38:48 +0000
2014-09-24T23:38:48.347819+00:00 app[web.1]: Completed 500 Internal Server Error in 95ms
2014-09-24T23:38:48.349962+00:00 app[web.1]:
2014-09-24T23:38:48.349966+00:00 app[web.1]:
2014-09-24T23:38:48.349969+00:00 app[web.1]: 2:
2014-09-24T23:38:48.347813+00:00 app[web.1]: Completed 500 Internal Server Error in 95ms
2014-09-24T23:38:48.349959+00:00 app[web.1]: 5: <p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
2014-09-24T23:38:48.349972+00:00 app[web.1]: 4:
2014-09-24T23:38:48.349974+00:00 app[web.1]: app/views/devise/mailer/confirmation_instructions.html.erb:5:in `_app_views_devise_mailer_confirmation_instructions_html_erb___2772878935586456441_70136789435480'
2014-09-24T23:38:48.349977+00:00 app[web.1]:
2014-09-24T23:38:48.252507+00:00 app[web.1]: Processing by Devise::RegistrationsController#create as HTML
2014-09-24T23:38:48.349953+00:00 app[web.1]: ActionView::Template::Error (Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true):
答案 0 :(得分:2)
我认为你的配置看起来适合主机。
<强>解决方案强>
为生产环境启用ActionMailer
设置:
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
address: 'smtp.sendgrid.net',
port: '587',
authentication: :plain,
user_name: ENV['SENDGRID_USERNAME'],
password: ENV['SENDGRID_PASSWORD'],
domain: 'heroku.com',
enable_starttls_auto: true
}
可以在config/environments/production.rb
或初始化程序脚本中指定这些设置。
如果使用初始化程序脚本,请确保依赖于环境的任何if
块防护包括生产,例如config/initializers/setup_mail.rb
:
if Rails.env.development? || Rails.env.production?
... # ActionMailer config goes here.
end
原始答案建议
现在只有三种可能出现的问题可能是问题所在。这些可能不对,但是这里就是。
错误消息来自哪里?运行heroku logs
?从您当地环境的终端?如果它是您的本地环境,请检查您的config/environments/development.rb
文件(并在您可能的情况下测试.rb)是否配置了主机选项。
也许这个变化还没有进入生产环境,或者生产环境没有在heroku上运行。
您可以检查heroku config
是否设置了RAILS_ENV
变量,如果确定,请确保将其设置为production
。 (在应用目录中运行heroku config
)。
检查最新代码是否已提交并推送到Heroku:
git status
git add . # Only if there are unstaged changes
git commit -m "Message describing changes"
git push heroku master
如果没有需要推送到Heroku的更改,请尝试heroku restart
。
答案 1 :(得分:1)
尝试将:host
选项传递给confirmation_url(@resource, confirmation_token: @token)
,例如
confirmation_url(@resource, confirmation_token: @token, host: 'myapp.herokuapp.com')
(虽然在模板中传递硬编码的生产URL感觉不对,但它可能会让你更接近找出问题)