在Rails中为dev / staging / production设置主机名的位置?

时间:2016-06-16 18:17:26

标签: ruby-on-rails ruby ruby-on-rails-3 configuration standards

My Rails(3.2.21)应用程序发送大量电子邮件,并且经常在开发和登台环境中进行测试。因此,只要电子邮件正文中有URL,主机名就需要与环境匹配。例如:

目前,我在initializers/setup_email.rb中有一个初始化程序,它根据环境设置ActionMailer::Base.default_url_options[:host]变量(此初始化程序还设置其他电子邮件设置fwiw)。 暂存例如是ActionMailer::Base.default_url_options[:host] = "example.staging.com"

dev 条件区块有一个:host AND :port,所以它看起来像这样:

ActionMailer::Base.default_url_options[:host] = "localhost"
ActionMailer::Base.default_url_options[:port] = 3000

在我的邮件程序类中,我有这些丑陋的条件,到处都有一个要显示的URL,因为我需要在dev中考虑端口。像这样:

if Rails.env.production? || Rails.env.staging?
    @url = "http://#{ActionMailer::Base.default_url_options[:host]}/something"
elsif Rails.env.development?
    @url = "http://#{ActionMailer::Base.default_url_options[:host]}:#{ActionMailer::Base.default_url_options[:port]}/something"
end

我在这里错过了什么最佳实践?我应该在任何方法之前在我的邮件程序类上面有上述条件语句一次,所以我设置一个@host变量并忘记它吗?

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是在development.rbproduction.rbstaging.rb中定义自定义常量。

类似的东西:

# development.rb
mailer_host = ActionMailer::Base.default_url_options[:host] = "localhost"
mailer_port = ActionMailer::Base.default_url_options[:port] = 3000
MailerURL = "http://#{mailer_host}:#{mailer_port}"

# production.rb
mailer_host = ActionMailer::Base.default_url_options[:host] = "foo.com"
MailerURL = "http://#{mailer_host}"

这样你可以避免条件限制。只需使用MailerURL,它将根据环境而有所不同