Rails 4.1.4,我有很多类邮件程序,它们都有不同的交付方式。现在这给我带来了一个问题。
在开发和测试环境中,当我将delivery_method作为:test
时,如果我使用以下类执行和交付,那么即使我在:custom_method
中提到config.delivery_method = :test
,交付方式也会变为class CustomMailer < ActionMailer::Base
default :delivery_method => :custom_method,
from: "...",
reply_to: '...'
def emailer(emails)
mail(to: emails, subject: 'test')
end
end
rails环境文件。
:custom_method
在开发和测试环境中将:test
更改为class CustomMailer < ActionMailer::Base
DELIVERY_METHOD = Rails.env == 'production' ? :custom_method : :test
default :delivery_method => DELIVERY_METHOD,
from: "...",
reply_to: '...'
def emailer(emails)
mail(to: emails, subject: 'test')
end
end
的正确方法是什么?
我实施的一个可行解决方案是:
DELIVERY_METHOD = Rails.env == 'production' ? :custom_method : :test
这适合我,但我觉得这不是一个好方法,因为我必须写这一行:
procedure ImpInsData(fileN varchar2)
as
CURSOR cur_extenal IS
(
select * from Tname WHERE A IN ('1','2')
);
begin
open cur_extenal
FETCH cur_extenal into rec
FOR rec IN cur_extenal LOOP
vId :=sys_guid();
vRowStatus:=rec.A;
vTag:=rec.C;
exit when cur_extenal%notfound;
end loop;
close cur_extenal;
end;
在每个Mailer类中都会导致冗余。如果能以某种常见的方式处理它会很棒。
请注意,每个Mailer类都有不同的递送方式。
答案 0 :(得分:2)
您采用的方法确实有效,但我相信在您的代码中查询Rails.env是一种反模式。
您可以通过设置custom config attribute来使用应用程序配置。这是一个例子:
# config/production.rb
Rails.application.configure do
# by having this configured by an environment variable
# you can have different values in staging,
# develop, demo, etc.. They all use "production" env.
config.x.mailer_livemode = ENV['MAILER_LIVEMODE']
end
# config/development.rb
Rails.application.configure do
config.x.mailer_livemode = false
end
# config/test.rb
Rails.application.configure do
config.x.mailer_livemode = false
end
# app/mailers/custom_mailer.rb
default delivery_method: Rails.application.config.x.mailer_livemode ? :custom_method : :test
灵活性优越。您可以将多个配置变量配合使用,在配置中直接设置delivery_method
等等。
最重要的是,您不会依赖不相关的东西(Rails.env)来处理与您的电子邮件发送方式有关的内容。
答案 1 :(得分:0)
如何创建ApplicationMailer并让所有其他邮件程序从ApplicationMailer继承?这是Rails5中的方法。下面的代码显示了一种在儿童邮件程序中定义交付方法的可能方法,并从ApplicationMailer继承了选择逻辑。
class ApplicationMailer < ActionMailer::Base
SELECTOR = Hash.new { |h,k| h[k] = k }
DELIVERY_METHOD = Rails.env.production? ? :custom_method : :test ##selection logic, use: env, env variables ...
end
class UserMailer < ApplicationMailer
SELECTOR[:custom_method] = :sendmail ##class-specific delivery method
default delivery_method: SELECTOR[DELIVERY_METHOD]
##....
end