register ActionMailer methods into Database
Posted by michael.schaerfer on 12-Nov-08 at 17:42
In the last posting, we talked about an ActionMailer active-check. For this approach to work, we need to register all instance-methods of all ActionMailer classes of our rails-app into the database.
The commonly used solution for this task is to search through your app/models directory, require all the *_mailer.rb classes and save them to the database. Like this:
1 Dir.glob("#{RAILS_ROOT}/app/models/*_mailer.rb").each do |file| 2 klass = File.basename( file, '.rb').classify.constantize 3 klass.instance_methods(false).each do |meth| 4 SystemMailer.find_or_create_by_mailer_class_and_mailer_method( 5 :mailer_class => klass.to_s, 6 :mailer_method => meth, 7 :active => true 8 ) 9 end 10 end
Put this into an initializer or your environment.rb file and you'r good to go. The downfall of this solution: You have to know all the directories of your Mailer classes, which might not be a problem, if you're following the "convention-over-configuration" rule inside your rails-app.
Another approach might be to get all subclasses of ActionMailer::Base:
1 ActionMailer::Base.subclasses_of( ActionMailer::Base ).each do |klass| 2 klass.instance_methods(false).each do |meth| 3 SystemMailer.find_or_create_by_mailer_class_and_mailer_method( 4 :mailer_class => klass.to_s, 5 :mailer_method => meth, 6 :active => true 7 ) 8 end 9 end
But this only works, if the subclasses of ActionMailer::Base are fully loaded/required (which is not the case, if your server just starts up).

Comments
There are 0 comments on this post. Post yours →
Post a comment
Required fields in bold.