7

Sendgrid Parse API と Griddler gem を使用して、受信メールを受け入れています。ほとんどの場合、これで問題なく動作します。ただし、ステータス コード 200 で Sendgrid に応答しない場合、Sendgrid はアプリが POST 要求を正しく受信しなかったと見なし、3 日間 POST を試行し続けます。ステータス コードで応答しようとしていますが、問題が発生しています。

通常の RESTful ルートでは、次のようなことができます...

render :status => 200

ただし、これは render メソッドを認識するためにコントローラーで行う必要があると思います。Griddler は、EmailProcessor モデルを作成し、「プロセス」メソッドを使用して電子メールを処理することを提案しています。

私が理解していることから、モデルで render メソッドを使用することはできません。そこで、以下に示すように、クラス メソッドを使用して EmailProcessorsController クラスを作成しました。

class EmailProcessor < ActiveRecord::Base

  include ApplicationHelper

  def initialize(email)
    @email = email
    @to = email.to # this is an array
    @from = email.from
  end

  def process
    # do other stuff
    EmailProcessorsController.render_ok
  end
end 

class EmailProcessorsController < ActionController::Base

  def self.render_ok
    render :status => 200
  end
end

以下は、アプリから取得したエラーです。render メソッドが気に入らない :(

NoMethodError (undefined method `render' for EmailProcessorsController:Class):
  app/controllers/email_processors_controller.rb:6:in `render_ok'
  app/models/email_processor.rb:16:in `process'

私は新しい開発者で、これはおそらく非常に単純なものですが、行き詰まっています。問題やデザインに関するご意見やご感想をお待ちしております。ありがとう!

アップデート!

@meagar の提案に従って、以下に示すようにレンダー呼び出しをコントローラーに移動しましたが、別のエラーが発生し、どうすればよいかわかりません。

class EmailProcessorsController < ApplicationController

  def initialize(email)
    @email = email
    @to = email.to # this is an array
    @from = email.from
  end

  def process
    # do other stuff
    render :status => 200
  end
end 

render 呼び出しがなければ、エラーは発生しません。render を呼び出すときに発生するエラーは次のとおりです...

Module::DelegationError (ActionController::RackDelegation#status= delegated to @_response.status=, but @_response is nil: #<EmailProcessorsController:0x000001063b1558 @email=#<Griddler::Email:0x00000106378ac8 @params={"headers"=>"Received: by mx-007.sjc1.send
4

1 に答える 1

6

renderクラスメソッドではなく、インスタンスメソッドです。コントローラーのインスタンスをインスタンス化する必要がありますが、それでもうまくいきません。

モデルからレンダリングしようとすると重大なエラーになります。モデルは、HTTP 要求が関係していることを認識していません。コントローラーはモデルを作成し、モデルに対するアクションを呼び出し、成功を待ってから、コントローラーが応答をレンダリングする必要があります。あなたがやろうとしていることは根本的に壊れています。

于 2014-10-02T01:58:19.447 に答える