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