基于条件的交货方式?轨道

时间:2017-10-07 06:29:23

标签: ruby-on-rails actionmailer development-environment

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类都有不同的递送方式。

2 个答案:

答案 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