Reputation: 4403
Right now I'm using this which works for the development host, but I have to manually change the {:host => ""} code when I move to production.
def share_all
url = Rails.application.routes.url_helpers.post_url(self, :host => 'localhost:3000')
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(url)
end
end
I'd like to use this and then define the default_url_options per environment:
def share_all
url = Rails.application.routes.url_helpers.post_url(self)
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(url)
end
end
I've tried adding this to my config/environments/development.rb but I still get the "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" error
config.action_controller.default_url_options = {:host => "localhost:3000"}
And I even tried it this way:
config.action_controller.default_url_options = {:host => "localhost", :port => "3000"}
EDIT:
I've now also followed this and still the same error guide http://edgeguides.rubyonrails.org/action_controller_overview.html#default_url_options
class ApplicationController < ActionController::Base
protect_from_forgery
include ApplicationHelper
def default_url_options
if Rails.env.production?
{ :host => "example.com"}
else
{:host => "example1.com"}
end
end
end
This is driving me crazy, what am I missing here???
Upvotes: 75
Views: 79994
Reputation: 1697
Set your specific url options in each environment file with
config.action_mailer.default_url_options = { host: 'hostname', port: 3000 }
And then set the default url options in your config/routes.rb
file with
Rails.application.routes.draw do
default_url_options Rails.application.config.action_mailer.default_url_options
...
end
Upvotes: 0
Reputation: 1877
This is how I usually go about this problem:
First, properly set your config/environments/production.rb
(and other environments) from the rails new
auto-generated file:
Rails.application.configure do
# [...]
config.action_mailer.default_url_options = {
host: "https://your_app.your_domain.tld"
} # You may also use an env variable ENV['HOST'] if necessary
end
Then, go back to your config/application.rb
and set to inherit from this ActionMailer configuration:
require_relative "boot"
require "rails/all"
Bundler.require(*Rails.groups)
module YourModule
class Application < Rails::Application
# [...]
config.after_initialize do |app|
app.routes.default_url_options = app.config.action_mailer.default_url_options
end
end
end
Upvotes: 4
Reputation: 14019
Just ran into this problem myself trying to generate a URL in a rake task. It's definitely non-obvious and many of these solutions will work. My solution is a take off from @joshua-pinter's but done in the environment file. For example my development.rb
looks like:
Rails.application.configure do
…
config.action_mailer.default_url_options = self.default_url_options = { host: 'localhost', port: 3000 }
…
end
with the appropriate changes made to production.rb
.
Upvotes: 1
Reputation: 671
config/environments/development.rb (any other environment, same)
add this row with host that you want
routes.default_url_options[:host] = 'localhost:3000'
Upvotes: 6
Reputation: 1045
For me whats worked is
ActionMailer::Base.default_url_options = { host: "yourhosthere"} # e.g. yourhosthere=localhost:3000 or yourhosthere=example.com
because if you already set a port in the config files then changing the [:host] only will result in an error
TypeError (no implicit conversion of Symbol into Integer):
Upvotes: 0
Reputation: 31
I know this is an old thread, but I ran into this with Ruby 2.6.3 and Rails 5.2.3. The behavior I was seeing was basically that every path I added would fail with Error during failsafe response: undefined method 'empty?' for nil:NilClass
. In production it worked fine, but in my development environment, I would get the error mentioned above.
The fix for me was add this to controllers/application_controller.rb
:
def default_url_options
if Rails.env.production?
Rails.application.routes.default_url_options = { host: "www.production-domain.com", protocol: 'https' }
elsif Rails.env.development?
Rails.application.routes.default_url_options = { host: 'localhost:3000', protocol: 'http' }
end
end
I was then able to run my development environment on my local.
Upvotes: 2
Reputation: 51
config.action_mailer.default_url_options = { :host => "your host" }
for instance your host localhost:3000
you can put this in test.rb, development.rb, production.rb files host could be different from environment to environment
Upvotes: 5
Reputation: 47471
default_url_options
from ActionMailer
.You want to keep things as DRY as possible so, ideally, you don't want to hard code your host and port in multiple places for the same environment, unless your ActionMailer
actually uses a different host and port than the rest of your Application
.
To set the default_url_options
for your entire Application
, simply add the following line to your config/environment.rb
file (changing MyApp
to your app's name):
# Set the default host and port to be the same as Action Mailer.
MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options
This will fix your problem and automatically set your Application
's default_url_options
to the same as your config.action_mailer.default_url_options
:
$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}
$ MyApp::Application.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}
Upvotes: 14
Reputation: 4403
Okay I figured it out the correct way to write it is
Rails.application.routes.default_url_options[:host] = 'localhost:3000'
:)
Upvotes: 132
Reputation: 107718
You have to restart your server before the changes to this file takes effect.
Upvotes: 7