0

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

UserとThoughtは、他の場所で問題なく使用されるデータベースリソースです。保存手順は、scaffoldで生成されたThoughtコントローラーで機能する手順と同じです。CloudmailinRails3の例からコピーしたparamsandロジック。Rails.logger

私は本当に混乱しています-どこが間違っているのですか?ポインタをいただければ幸いです。

4

1 に答える 1

0

これが、睡眠不足でコードを書いてはいけない理由です。問題は単純でした: というものはなくparams[:envelope][:from]、 しかありませんparams[:from]):fromのサブ要素であるという私の仮定は、おそらく 2 番目の「Rails on Heroku のCloudmailin 」の例:envelopeのパターンを見ることによって形成されました。Rails.logger.log params[:envelope][:subject]

「元の」 Cloudmailin 形式の API ドキュメントを読んだ後、これがエラーであることに気付きました。そもそもこのリソースを見つけたり探したりしなかったのは、非常に愚かでした。

これを修正した後、オブジェクトが期待されていたのにオブジェクトUser.where(:email => params[:from])しか返さなかったため、コードはまだ機能しませんでした。Heroku ログのエラーは次のとおりです。RelationUser

 ActiveRecord::AssociationTypeMismatch (User(#29025160) expected,
 got ActiveRecord::Relation(#12334440)):

一部の電子メールを使用できるのは 1 人のユーザーのみであるため、この修正User.where(:email => params[:from]).firstには副作用がなく、正しい動作が得られます。

于 2013-02-28T01:46:21.040 に答える