gaveeno
2008-Oct-08 15:34 UTC
Using an ActiveRecord class method within an ActionMailer object
This is a little convoluted and I''m new to Rails, so please bear with me... My application needs to receive both SMS and emails. I have a controller that has a sms_in method, which receives SMS messages via a HTTP POST request from an SMS gateway. That controller then calls the IncomingMessage.process(args) method to go through a number of validations and create the incoming message in the database as well as various other database entries that are required with each incoming message. This works fine. However, I''m having trouble getting it to work for emails. In my MailProcessor (ActionMailer) receive method, I''m trying to pass similar arguments to the IncomingMessage.process(args) class method. However, for some reason this isn''t working...I can''t seem to call a class method for an ActiveRecord object from within the ActionMailer object, and I have no idea why! Any help would be greatly appreciated! -Gavin --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Oct-08 15:51 UTC
Re: Using an ActiveRecord class method within an ActionMailer object
On 8 Oct 2008, at 16:34, gaveeno wrote:> > This is a little convoluted and I''m new to Rails, so please bear with > me... > > My application needs to receive both SMS and emails. I have a > controller that has a sms_in method, which receives SMS messages via a > HTTP POST request from an SMS gateway. That controller then calls the > IncomingMessage.process(args) method to go through a number of > validations and create the incoming message in the database as well as > various other database entries that are required with each incoming > message. This works fine. > > However, I''m having trouble getting it to work for emails. In my > MailProcessor (ActionMailer) receive method, I''m trying to pass > similar arguments to the IncomingMessage.process(args) class method. > However, for some reason this isn''t working...I can''t seem to call a > class method for an ActiveRecord object from within the ActionMailer > object, and I have no idea why! >That should work. Show what you''re doing (and describe what you actually mean by "isn''t working") Fred> Any help would be greatly appreciated! > -Gavin > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
gaveeno
2008-Oct-08 16:36 UTC
Re: Using an ActiveRecord class method within an ActionMailer object
I''m using the Fetcher plugin which daemonizes polling the server for
emails. When it pulls in an email, it passes it (the Net::Imap
object) to the receive method of MailProcessor < ActionMailer::Base.
The receive method then calls the process_message class method of
IncomingMessage < ActiveRecord::Base, which should store the incoming
message to the database as well as do a number of other things.
However, this method does not seem to be getting executed for incoming
emails. On the other hand, when this method is called from the
controller containing the sms_in action, the message gets processed/
stored correctly. These are the methods in question:
class MailProcessor < ActionMailer::Base
def receive(mail)
IncomingMessage.process_message({ :sender => mail.from,
:subject => mail.subject,
:channel => "email",
:person_search_field => "email",
:date => mail.date,
:body => mail.body,
:delivery_point => mail.to })
end
class MessengerController < ApplicationController
def sms_in
@incoming_message, @opt_or_feedback_object,@processing_notes
IncomingMessage.process_message({ :sender => params[:smsfrom],
:subject => params[:smsmsg],
:channel => "sms",
:gateway_id => params[:smsid],
:person_search_field => "mobile_phone",
:date => params[:smsdate],
:carrier => params[:network],
:delivery_point => params[:smsto] })
end
class IncomingMessage < ActiveRecord::Base
protected
def self.process_message(msg_hash)
@incoming_message = create_incoming_message
#more code to process the message...I didn''t paste it here
because it calls
#a number of other class methods and they would be too much to
paste
end
def self.create_incoming_message
IncomingMessage.create(:subject => @msg_hash[:subject],
:person_id => "#{@person.id}",
:body => @msg_hash[:body],
:channel => @msg_hash[:channel],
:gateway_id => @msg_hash[:gateway_id],
:carrier => @msg_hash[:carrier],
:date => @msg_hash[:date],
:delivery_point_id => @delivery_point_id)
end
On Oct 8, 11:51 am, Frederick Cheung
<frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> On 8 Oct 2008, at 16:34, gaveeno wrote:
>
>
>
>
>
> > This is a little convoluted and I''m new to Rails, so please
bear with
> > me...
>
> > My application needs to receive both SMS and emails. I have a
> > controller that has a sms_in method, which receives SMS messages via a
> > HTTP POST request from an SMS gateway. That controller then calls the
> > IncomingMessage.process(args) method to go through a number of
> > validations and create the incoming message in the database as well as
> > various other database entries that are required with each incoming
> > message. This works fine.
>
> > However, I''m having trouble getting it to work for emails.
In my
> > MailProcessor (ActionMailer) receive method, I''m trying to
pass
> > similar arguments to the IncomingMessage.process(args) class method.
> > However, for some reason this isn''t working...I
can''t seem to call a
> > class method for an ActiveRecord object from within the ActionMailer
> > object, and I have no idea why!
>
> That should work. Show what you''re doing (and describe what you
> actually mean by "isn''t working")
>
> Fred
>
> > Any help would be greatly appreciated!
> > -Gavin
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Oct-10 16:41 UTC
Re: Using an ActiveRecord class method within an ActionMailer object
On Oct 10, 5:32 pm, gaveeno <gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Anybody know why this isn''t working for me? >Well you haven''t said exactly what is happening, eg if you put a breakpoint in create_incoming_message is it hit? have you tried stepping through the code and seeing when it fails? Could it be that creation of the incoming_message fails because of validation? Do you really mean to be creating class instance variables ? Fred --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
gaveeno
2008-Oct-10 17:18 UTC
Re: Using an ActiveRecord class method within an ActionMailer object
When you ask if I really mean to be creating class instance variables,
I assume you''re referring to @incoming_message,
@opt_or_feedback_object, @processing_notes
IncomingMessage.process_message()...correct? The reason I set class
instance variables is because the view for this action needs to
display details from the incoming message, the object created from the
the incoming message, and the notes that are generated during
processing (including the validation results mostly). I didn''t paste
the last line of the IncomingMessage.process_message() method above,
but FYI it is "return
@incoming_message,@opt_or_feedback_object,@processed_msg_array[0]".
No, the reason is not that it''s failing because of validations within
the IncomingMessage.process_message() method, because the terminal
window shows now SQL being executed, and also there are items
persisted to the DB regardless of whether validation succeeds or
fails. I took your tip and used breakpoints to see what''s happening
here (this is my first Rails app and I stupidly didn''t think to look
into the Rails debug tools). When a SMS comes in, the breakpoint at
the start of the IncomingMessage.process_message() method is hit.
However, when an email comes in, not breakpoints are hit, regardless
of where they are. I.e. in the MailProcesser.receive() method, I put
the following 2 lines:
1 puts "debug"
2 debugger
The terminal window where I executed the script displays "debug", but
processing does not stop at the breakpoint.
This might help...it''s the fetcher script that is daemonized (and I
can post more of the code from the Fetcher plugin if you think that
it''d be helpful):
#!/usr/bin/env ruby
require File.dirname(__FILE__) + ''/../config/environment.rb''
class MailFetcherDaemon < Daemon::Base
@config = YAML.load_file("#{RAILS_ROOT}/config/mail.yml")
@config = @config[RAILS_ENV].to_options
@sleep_time = @config.delete(:sleep_time) || 60
def self.start
puts "Starting MailFetcherDaemon"
@fetcher = Fetcher.create({:receiver =>
MailProcessor}.merge(@config))
loop do
@fetcher.fetch
sleep(@sleep_time)
end
end
def self.stop
puts "Stopping MailFetcherDaemon"
end
end
MailFetcherDaemon.daemonize
Thanks for your help!
-Gavin
On Oct 10, 12:41 pm, Frederick Cheung
<frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> On Oct 10, 5:32 pm, gaveeno
<gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > Anybody know why this isn''t working for me?
>
> Well you haven''t said exactly what is happening, eg if you put a
> breakpoint in create_incoming_message is it hit? have you tried
> stepping through the code and seeing when it fails?
> Could it be that creation of the incoming_message fails because of
> validation? Do you really mean to be creating class instance
> variables ?
>
> Fred
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
David
2008-Oct-15 05:59 UTC
Re: Using an ActiveRecord class method within an ActionMailer object
What SMS gateway are you using if you don''t mind me asking? Is it open source or are you paying per message? On Oct 10, 10:18 am, gaveeno <gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> When you ask if I really mean to be creating class instance variables, > I assume you''re referring to @incoming_message, > @opt_or_feedback_object, @processing_notes > IncomingMessage.process_message()...correct? The reason I set class > instance variables is because the view for this action needs to > display details from the incoming message, the object created from the > the incoming message, and the notes that are generated during > processing (including the validation results mostly). I didn''t paste > the last line of the IncomingMessage.process_message() method above, > but FYI it is "return > @incoming_message,@opt_or_feedback_object,@processed_msg_array[0]". > > No, the reason is not that it''s failing because of validations within > the IncomingMessage.process_message() method, because the terminal > window shows now SQL being executed, and also there are items > persisted to the DB regardless of whether validation succeeds or > fails. I took your tip and used breakpoints to see what''s happening > here (this is my first Rails app and I stupidly didn''t think to look > into the Rails debug tools). When aSMScomes in, the breakpoint at > the start of the IncomingMessage.process_message() method is hit. > However, when an email comes in, not breakpoints are hit, regardless > of where they are. I.e. in the MailProcesser.receive() method, I put > the following 2 lines: > 1 puts "debug" > 2 debugger > The terminal window where I executed the script displays "debug", but > processing does not stop at the breakpoint. > > This might help...it''s the fetcher script that is daemonized (and I > can post more of the code from the Fetcher plugin if you think that > it''d be helpful): > > #!/usr/bin/env ruby > require File.dirname(__FILE__) + ''/../config/environment.rb'' > > class MailFetcherDaemon < Daemon::Base > > @config = YAML.load_file("#{RAILS_ROOT}/config/mail.yml") > @config = @config[RAILS_ENV].to_options > > @sleep_time = @config.delete(:sleep_time) || 60 > def self.start > puts "Starting MailFetcherDaemon" > @fetcher = Fetcher.create({:receiver => > MailProcessor}.merge(@config)) > > loop do > @fetcher.fetch > sleep(@sleep_time) > end > end > > def self.stop > puts "Stopping MailFetcherDaemon" > end > > end > > MailFetcherDaemon.daemonize > > Thanks for your help! > -Gavin > > On Oct 10, 12:41 pm, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > wrote: > > > On Oct 10, 5:32 pm, gaveeno <gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > Anybody know why this isn''t working for me? > > > Well you haven''t said exactly what is happening, eg if you put a > > breakpoint in create_incoming_message is it hit? have you tried > > stepping through the code and seeing when it fails? > > Could it be that creation of the incoming_message fails because of > > validation? Do you really mean to be creating class instance > > variables ? > > > Fred--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
gaveeno
2008-Oct-15 18:03 UTC
Re: Using an ActiveRecord class method within an ActionMailer object
We are using a shared shortcode provided by another company, so nope it''s not open source. As far as I''m aware, open source SMS gateways such as Kannel still require that you have a shortcode leased and registered with the various carriers, which is really expensive. There''s really doesn''t seem to be any way to avoid a per-message cost for outgoing messages (many mobile gateway providers don''t charge for incoming messages). David wrote:> What SMS gateway are you using if you don''t mind me asking? Is it > open source or are you paying per message? > > On Oct 10, 10:18�am, gaveeno <gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > When you ask if I really mean to be creating class instance variables, > > I assume you''re referring to @incoming_message, > > @opt_or_feedback_object, @processing_notes > > IncomingMessage.process_message()...correct? �The reason I set class > > instance variables is because the view for this action needs to > > display details from the incoming message, the object created from the > > the incoming message, and the notes that are generated during > > processing (including the validation results mostly). �I didn''t paste > > the last line of the IncomingMessage.process_message() method above, > > but FYI it is "return > > @incoming_message,@opt_or_feedback_object,@processed_msg_array[0]". > > > > No, the reason is not that it''s failing because of validations within > > the IncomingMessage.process_message() method, because the terminal > > window shows now SQL being executed, and also there are items > > persisted to the DB regardless of whether validation succeeds or > > fails. �I took your tip and used breakpoints to see what''s happening > > here (this is my first Rails app and I stupidly didn''t think to look > > into the Rails debug tools). �When aSMScomes in, the breakpoint at > > the start of the IncomingMessage.process_message() method is hit. > > However, when an email comes in, not breakpoints are hit, regardless > > of where they are. �I.e. in the MailProcesser.receive() method, I put > > the following 2 lines: > > 1 � � puts "debug" > > 2 � � debugger > > The terminal window where I executed the script displays "debug", but > > processing does not stop at the breakpoint. > > > > This might help...it''s the fetcher script that is daemonized (and I > > can post more of the code from the Fetcher plugin if you think that > > it''d be helpful): > > > > #!/usr/bin/env ruby > > require File.dirname(__FILE__) + ''/../config/environment.rb'' > > > > class MailFetcherDaemon < Daemon::Base > > > > � @config = YAML.load_file("#{RAILS_ROOT}/config/mail.yml") > > � @config = @config[RAILS_ENV].to_options > > > > � @sleep_time = @config.delete(:sleep_time) || 60 > > � def self.start > > � � puts "Starting MailFetcherDaemon" > > � � @fetcher = Fetcher.create({:receiver => > > MailProcessor}.merge(@config)) > > > > � � loop do > > � � � @fetcher.fetch > > � � � sleep(@sleep_time) > > � � end > > � end > > > > � def self.stop > > � � puts "Stopping MailFetcherDaemon" > > � end > > > > end > > > > MailFetcherDaemon.daemonize > > > > Thanks for your help! > > -Gavin > > > > On Oct 10, 12:41�pm, Frederick Cheung <frederick.che...@gmail.com> > > wrote: > > > > > On Oct 10, 5:32�pm, gaveeno <gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > > > Anybody know why this isn''t working for me? > > > > > Well you haven''t said exactly what is happening, eg if you put a > > > breakpoint in create_incoming_message is it hit? have you tried > > > stepping through the code and seeing when it fails? > > > Could it be that creation of the incoming_message fails because of > > > validation? Do you really mean to be creating class instance > > > variables ? > > > > > Fred--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
David
2008-Oct-16 00:29 UTC
Re: Using an ActiveRecord class method within an ActionMailer object
I have installed and am using SMS-Fu: http://brendanlim.com/2008/2/28/send-text-messages-from-rails-with-sms-fu, which appears to be free to send sms messages. Maybe there is a limit with this, I am not sure, I read somewhere 500 max in any given 3 day period but maybe it varies for different carriers? What I would really like is to be able to receive SMS for free, but it doesnt look like its in the cards. On Oct 15, 11:03 am, gaveeno <gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> We are using a shared shortcode provided by another company, so nope > it''s not open source. As far as I''m aware, open source SMS gateways > such as Kannel still require that you have a shortcode leased and > registered with the various carriers, which is really expensive. > There''s really doesn''t seem to be any way to avoid a per-message cost > for outgoing messages (many mobile gateway providers don''t charge for > incoming messages). > > David wrote: > > What SMS gateway are you using if you don''t mind me asking? Is it > > open source or are you paying per message? > > > On Oct 10, 10:18 am, gaveeno <gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > When you ask if I really mean to be creating class instance variables, > > > I assume you''re referring to @incoming_message, > > > @opt_or_feedback_object, @processing_notes > > > IncomingMessage.process_message()...correct? The reason I set class > > > instance variables is because the view for this action needs to > > > display details from the incoming message, the object created from the > > > the incoming message, and the notes that are generated during > > > processing (including the validation results mostly). I didn''t paste > > > the last line of the IncomingMessage.process_message() method above, > > > but FYI it is "return > > > @incoming_message,@opt_or_feedback_object,@processed_msg_array[0]". > > > > No, the reason is not that it''s failing because of validations within > > > the IncomingMessage.process_message() method, because the terminal > > > window shows now SQL being executed, and also there are items > > > persisted to the DB regardless of whether validation succeeds or > > > fails. I took your tip and used breakpoints to see what''s happening > > > here (this is my first Rails app and I stupidly didn''t think to look > > > into the Rails debug tools). When aSMScomes in, the breakpoint at > > > the start of the IncomingMessage.process_message() method is hit. > > > However, when an email comes in, not breakpoints are hit, regardless > > > of where they are. I.e. in the MailProcesser.receive() method, I put > > > the following 2 lines: > > > 1 puts "debug" > > > 2 debugger > > > The terminal window where I executed the script displays "debug", but > > > processing does not stop at the breakpoint. > > > > This might help...it''s the fetcher script that is daemonized (and I > > > can post more of the code from the Fetcher plugin if you think that > > > it''d be helpful): > > > > #!/usr/bin/env ruby > > > require File.dirname(__FILE__) + ''/../config/environment.rb'' > > > > class MailFetcherDaemon < Daemon::Base > > > > @config = YAML.load_file("#{RAILS_ROOT}/config/mail.yml") > > > @config = @config[RAILS_ENV].to_options > > > > @sleep_time = @config.delete(:sleep_time) || 60 > > > def self.start > > > puts "Starting MailFetcherDaemon" > > > @fetcher = Fetcher.create({:receiver => > > > MailProcessor}.merge(@config)) > > > > loop do > > > @fetcher.fetch > > > sleep(@sleep_time) > > > end > > > end > > > > def self.stop > > > puts "Stopping MailFetcherDaemon" > > > end > > > > end > > > > MailFetcherDaemon.daemonize > > > > Thanks for your help! > > > -Gavin > > > > On Oct 10, 12:41 pm, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > > > wrote: > > > > > On Oct 10, 5:32 pm, gaveeno <gavin.to...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > > > Anybody know why this isn''t working for me? > > > > > Well you haven''t said exactly what is happening, eg if you put a > > > > breakpoint in create_incoming_message is it hit? have you tried > > > > stepping through the code and seeing when it fails? > > > > Could it be that creation of the incoming_message fails because of > > > > validation? Do you really mean to be creating class instance > > > > variables ? > > > > > Fred--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---