在 Rails 中为开发/暂存/生产设置主机名的位置?

问题描述 投票:0回答:2

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

目前,我在

initializers/setup_email.rb
中有一个初始化程序,它根据环境设置
ActionMailer::Base.default_url_options[:host]
变量(这个初始化程序还设置了其他电子邮件设置 fwiw)。 Staging例如是
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,因为我需要在开发中考虑端口。像这样:

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

我在这里缺少什么最佳实践?我是否应该在任何方法之前在我的邮件程序类顶部只使用上述条件语句once,所以我设置一个

@host
变量一次然后忘记它?

ruby-on-rails ruby ruby-on-rails-3 configuration standards
2个回答
1
投票

我认为最简单的方法是在

development.rb
production.rb
staging.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
会根据环境不同


0
投票

也可以保存为环境变量

ENV["HOST_URL"]

© www.soinside.com 2019 - 2024. All rights reserved.