ActionMailer & controller

Matt Stone wrote:

Hi,

I have an actionmailer script that happily processes an inbox. It is called via script & reads emails & grabs the attachments for further processing

I want to be able to access a method [process_attachment] in app/controllers/application.rb, but the mailman routine does not appear to be able to access it. I've tried both including environment.rb & app/controllers/application.rb but still get the error - undefined method 'process_attachment'

Is there anyway to do this, or do I have to move the logic somewhere else..??

-------------------------------------------- mailman.rb --------------------------------------------

require File.dirname(__FILE__) + '/../../config/environment.rb' require File.dirname(__FILE__) + '/../../app/controllers/application.rb'

class Inbound < ActiveRecord::Base end

class Mailman < ActionMailer::Base

  def receive(email)       email.attachments.each do |attachment|         inbound = Inbound.new         inbound.attachment = attachment         process_attachment(inbound)       end     end   end

Hey

I'm not sure if this is the best method, its probably not even a good method :] but it's something you could try in the meantime :slight_smile:

extract the method into a separate file into your /lib directory, aka. /lib/my_truly_global_methods.rb

Then require this file in either your environment.rb, or (less blasphemously) in your mailer class. Doesn't feel very elegant, I know, but I'm not sure if something like helper_method exists for mailers...

Hope this helps... Cheery-o Gustav Paul gustav@rails.co.za

Hi Matt,

Dumb question: Where is the methode process_attachment currently defined?

Regards, Simon

Ah ok. Now I understand.

Your problem is, that ApplicationController is the parent class of all Controllers in a Ruby on Rails Application. But you extend ActionMailer and ActionMailer doesn't extends ApplicationController.

You could do the following

class Mailman < ActionMailer::Base

  def receive(email)       application = ApplicationController.new       email.attachments.each do |attachment|         inbound = Inbound.new         inbound.attachment = attachment         application.process_attachment(inbound)       end     end   end

I'm not sure if this is an elegant solution but it should work. Otherwise put process_attachement in any class and you can instantiate this instead of ApplicationController.

Cheers, Simon