0

私は実際に、新しいメーリング リストをオンザフライで作成し、テンプレートをアップロードして、そのリストから次のような方法で購読者に電子メールを送信できるニュースレター マスメーリング ソフトウェアを作成しています。

@suscribers.each do |suscriber|
    NewsletterMailer.delay.send("#{@list.name}_newsletter", suscriber, @newsletter)
end

(遅延方法は、バックグラウンド ジョブに sidekiq を使用しているためであることに注意してください)

このロジックを処理するために、NewsletterMailer クラス内の ActionMailer::Base から method_missing をオーバーライドしようとしましたが、実行されないようです。「NewsletterMailer:Class の未定義メソッド `testing_newsletter'」という NoMethodError を受け取りました。

ActionMailer::Base#method_missing ソース コードを調べたところ、既にいくつかのロジックが実行されていることがわかり、new を呼び出さずに Mailer.name_of_the_email.deliver を実行できるようになりました。また、このメソッドは保護されています。

しかし、NewsletterMailer クラス内にハードコーディングされていないメソッドからメールを送信する方法はありますか? メソッドを ActionMailer コントローラに動的に追加する方法はありますか?

どうもありがとう。

4

2 に答える 2

1

として定義し def method_missing ...た場合、インスタンス メソッドが作成されていますが、コードは動的メッセージをクラス自体に送信していることを示しています。記述したとおりに実行する場合はself.method_missing、 onを定義する必要があります。NewsletterMailer

そうは言っても、特定のケースではこの設計をお勧めしません。私が心に留めておきたいのは、行動(すべてのニュースレターに共通する方法とアクション) と、特定のリストおよび/またはそのニュースレターの詳細を記述するデータがあるということです。ほとんどの場合、これらは、動作を記述するコードと、データを保持するデータベースを使用して、個別に区別する必要があります。send_newsletterメーリング リストを引数として受け取るメソッドがあれば、メーリング リストごとに新しいメソッドを定義してもほとんど意味がありません。

于 2013-08-06T18:14:44.333 に答える
0

class_eval を使用して、その場で新しいメソッドを定義できます。

class SomeClass
end

[:foo, :bar].each do |name|
  SomeClass.class_eval <<COMMAND
    def self.#{name}
      puts "Hello from #{name}"
    end
COMMAND
end

SomeClass.foo
SomeClass.bar 
于 2013-08-06T18:14:24.520 に答える