我使用Cloudmailin插件接收来自Heroku应用的电子邮件。但是,Cloudmailin无法提供 - 或者说,它每次从Heroku获得500(所以地址是正确的)。
Heroku日志中的错误是
Started POST "/incoming_mails" for 109.107.35.53 at 2013-02-27 08:54:22 +0000
2013-02-27T08:54:23+00:00 app[web.1]: Entering the controller! Controlling the e-mail!
2013-02-27T08:54:23+00:00 app[web.1]:
2013-02-27T08:54:23+00:00 app[web.1]: NoMethodError (undefined method `[]' for nil:NilClass):
2013-02-27T08:54:23+00:00 app[web.1]: app/controllers/incoming_mails_controller.rb:7:in `create'
我的路由是正确的; "进入控制器!控制电子邮件!"来自课程开头的学习课程,所以课程肯定会进入。
# routes.rb
post '/incoming_mails' => 'incoming_mails#create'
文件本身如下:
# /app/controllers/incoming_mails_controller.rb
class IncomingMailsController < ApplicationController
skip_before_filter :verify_authenticity_token
def create
puts "Entering the controller! Controlling the e-mail!"
Rails.logger.info params[:headers][:subject]
Rails.logger.info params[:plain]
Rails.logger.info params[:html]
if User.all.map(&:email).include? params[:envelope][:from] # check if user is registered
@thought = Thought.new
@thought.body = params[:plain].split("\n").first
@thought.user = User.where(:email => params[:envelope][:from])
@thought.date = DateTime.now
if @thought.save
render :text => 'Success', :status => 200
else
render :text => 'Internal failure', :status => 501
end
else
render :text => 'Unknown user', :status => 404 # 404 would reject the mail
end
end
end
用户和思想是其他地方使用的数据库资源,没有问题。保存过程与脚手架生成的Thought控制器相同。我从Cloudmailin Rails 3 example复制的params
和Rails.logger
逻辑。
我真的很困惑 - 我哪里错了?我非常感谢任何指针。
答案 0 :(得分:0)
事实证明,这就是为什么你不应该在睡眠不足时进行编码。问题很简单:没有params[:envelope][:from]
这样的东西,只有params[:from])
。我假设:from
可能是:envelope
的子元素,可能是通过查看the second "Cloudmailin in Rails on Heroku" example中的模式来形成的,其中用于记录主题的代码是Rails.logger.log params[:envelope][:subject]
。< / p>
我在阅读the API documentation for 'original' Cloudmailin format后意识到这是错误。我没有找到/寻找这个资源,这是非常愚蠢的。
修复此问题后,代码仍然无效,因为User.where(:email => params[:from])
仅返回Relation
个对象,而User
对象是预期的。 Heroku日志中的错误如下:
ActiveRecord::AssociationTypeMismatch (User(#29025160) expected,
got ActiveRecord::Relation(#12334440)):
由于只有一个用户可以使用某些电子邮件,因此修复User.where(:email => params[:from]).first
没有副作用并导致正确的行为。