ruby 在Rails中何处设置开发/登台/生产的主机名?

dfuffjeb  于 2023-03-17  发布在  Ruby
关注(0)|答案(2)|浏览(116)

我的Rails(3.2.21)应用发送了大量的电子邮件,而且它经常在开发和过渡环境中进行测试。因此,每当电子邮件正文中有一个URL时,主机名都需要与环境相匹配。例如:

目前,我在initializers/setup_email.rb中有一个初始化器,它根据环境设置ActionMailer::Base.default_url_options[:host]变量(这个初始化器还设置其他电子邮件设置fwiw)。
但是,dev条件块有一个:hostAND:port,因此它看起来如下所示:

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

在我的邮件类中,我在所有需要显示URL的地方都使用了这些丑陋的条件语句,因为我需要在dev中说明port。

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变量,然后忘记它?

ubof19bj

ubof19bj1#

我认为最简单的方法是在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,它会因环境而异

9cbw7uwe

9cbw7uwe2#

也可以将其另存为环境变量ENV["HOST_URL"]

相关问题