2014-11-14 2 views
0

У меня встроенный API-интерфейс Webgook для входящего сеанса Sendgrid, и он правильно отправляет объект электронной почты в мое приложение rails. В приложении я использую griddler gem, чтобы поймать и продолжить обработку данных электронной почты. Но я получаю следующее исключение:Griddler gem throwing exception при разборе входящего письма

Sent mail to [email protected] (77.6ms) 
F, [2014-11-14T17:48:05.851336 #24799] FATAL -- : 
NoMethodError (undefined method `process' for #<EmailProcessor:0x0000000a2ad5f0>): 
    griddler (1.1.0) app/controllers/griddler/emails_controller.rb:19:in `public_send' 
    griddler (1.1.0) app/controllers/griddler/emails_controller.rb:19:in `process_email' 
    griddler (1.1.0) app/controllers/griddler/emails_controller.rb:4:in `block in create' 
    griddler (1.1.0) app/controllers/griddler/emails_controller.rb:3:in `each' 
    griddler (1.1.0) app/controllers/griddler/emails_controller.rb:3:in `create' 
    actionpack (4.1.4) lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
    actionpack (4.1.4) lib/abstract_controller/base.rb:189:in `process_action' 
    actionpack (4.1.4) lib/action_controller/metal/rendering.rb:10:in `process_action' 
    actionpack (4.1.4) lib/abstract_controller/callbacks.rb:20:in `block in process_action' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:113:in `call' 

Где, как у меня есть метод экземпляра процесса в /mailer/email_processor.rb

class EmailProcessor 
    def initialize(email) 
    @email = email 
    puts "initialized Email Processor\n\n\n\n\n\n\n\n" # Should see this line in log 
    end 

    def process 
    user = User.find_by_email(@email.from[:email]) 
    puts @email.inspect and return if user.blank? 

    puts "############### @email = #{@email.inspect}###############\n\n\n\n\n\n\n" 
    end 
end 

Вот конфиг/инициализатор/griddler.rb

Griddler.configure do |config| 
    config.processor_class = EmailProcessor 
    config.processor_method = :process 
    config.reply_delimiter = '-- REPLY ABOVE THIS LINE --' 
    config.email_service = :sendgrid 
end 

Вот версия драгоценного камня я использую:

#Process incoming mail from sendgrid smtp server 
gem 'griddler', "~> 1.1.0" 
gem 'griddler-sendgrid', "~> 0.0.1" 

Основано на документации, доступной по адресу griddler github

Может ли кто-нибудь помочь мне в том, чего я здесь не хватает. Кроме того, почему я не вижу следующую строку в журнале?

"initialized Email Processor\n\n\n\n\n\n\n\n" 

Ниже линии, чтобы маршрутизировать определить

mount_griddler 

EDIT: Насколько я знаю, рельсы не добавляет такой класс непосредственно. Как ни странно, я в состоянии видеть метод «процесса» доступный для класса «EmailProcessor» в «рельсы консоли»:

2.1.4 :005 > x = EmailProcessor.new(1) 
initialized Email Processor\n\n\n\n\n\n\n\n 
=> #<EmailProcessor:0x007fc6ae5aee08 @email=1> 
2.1.4 :006 > x.methods 
=> [:process, :blank?, :present?, ... 
2.1.4 :014 > EmailProcessor.instance_methods(false) 
=> [:process] 

Благодаря

+0

Может ли быть другой 'EmailProcessor' класс в вашем коде? похоже, что вы не подписываетесь на этот класс, который, по вашему мнению, делает ... –

+0

Нет такого существующего класса. Чтобы быть уверенным, вы снова искали всю кодовую базу. Я не думаю, что у рельсов есть встроенный класс с тем же именем. См. Обновление выше. Благодарю. – Indyarocks

+0

Попробуйте добавить код, который вы пробовали в редактировании, внутри блока «Griddler.configure» –

ответ

3

Вопрос был, то EmailProcessor класс не загружается с рельсов запуск приложения. Добавление следующих строк в application.rb же магии:

config.autoload_paths += %W(#{config.root}/app/mailers/email_processor.rb) 

ПРИМЕЧАНИЯ: Вам необходимо перезагрузить сервер, каждый раз, когда вы делаете изменения в email_processor.rb.

Благодаря Joel Oliveira (автор Griddler) в реагировании на мой личный адрес электронной почты и указывая на вопрос :)