ActionMailer & controller

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

Matt S. wrote:

method ‘process_attachment’

  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 P.
[email protected]

Hi Matt,

Dumb question:
Where is the methode process_attachment currently defined?

Regards, Simon

[email protected] wrote:

Hi Matt,

Dumb question:
Where is the methode process_attachment currently defined?

Regards, Simon

Simon,

Thanks for your response, I really appreciate it.

process_attachement is defined in app/controller/application.rb. It also
processes uploaded files.

I want to have the same logic process the files uploaded via a browser,
& files sent as attachments.

I’m really confused as to how is the best way to achieve this.

rgds,

  • matt.

Simon,

Thanks for that - works perfectly. The explanation was great, I know
understand why it works perfectly.

rgds,

  • matt.

[email protected] wrote:

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

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