ActionView :: Template :: Error(缺少要链接的主机!请提供:host参数,设置default_url_options [:host],或将:only_path设置为true):

时间:2014-09-25 20:35:02

标签: ruby-on-rails heroku

当我尝试在生产中为我的应用注册新用户时出现以下错误。我已经阅读了所有其他具有相同错误的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):

2 个答案:

答案 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感觉不对,但它可能会让你更接近找出问题)