Неопределенный метод рендеринга в контроллере Rails - Попытка ответить на Sendgrid кодом состояния 200

Я использую Sendgrid Parse API вместе с гемом Griddler для приема входящих писем. По большей части это работает нормально; однако, если вы не ответите на Sendgrid с кодом состояния 200, они будут считать, что приложение неправильно получило запрос POST, и будут пытаться выполнить POST в течение 3 дней. Я пытаюсь ответить кодом состояния и у меня возникли проблемы.

В обычных маршрутах RESTful вы можете сделать что-то вроде...

render :status => 200

Тем не менее, я считаю, что это должно быть сделано в контроллере для распознавания метода рендеринга. Гриддлер предлагает вам создать модель EmailProcessor и использовать метод 'process' для обработки электронной почты.

Насколько я понимаю, вы не можете использовать метод рендеринга в моделях. Итак, я создал класс 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

Ниже приведена ошибка, которую я получаю из своего приложения. Не нравится метод рендеринга:(

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...

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

1 ответ

render это метод экземпляра, а не метод класса. Вам нужно создать экземпляр вашего контроллера, но это не сработает.

Это серьезная ошибка при попытке рендеринга из вашей модели. Модель не имеет ни малейшего представления, что существует HTTP-запрос. Ваш контроллер должен создавать вашу модель, вызывать любые действия с ней, ждать успеха, а затем ваш контроллер должен обрабатывать ответ. То, что вы пытаетесь сделать, в корне сломано.

Другие вопросы по тегам