Противоречивое имя класса в Rails - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь использовать API sendgrid-ruby для отправки электронных писем.У меня есть модель Attachment, которую я использую для отслеживания загруженных файлов в корзине AWS.

Я только что попытался запустить пакетную установку после установки

gem 'sendgrid-ruby' 

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

TypeError (superclass mismatch for class Attachment):

app/models/attachment.rb:1:in `<top (required)>'
app/controllers/jobs_controller.rb:182:in `edit'

Есть ли способ исправить это без изменения названия моей модели?

ОБНОВЛЕНИЕ:

Мой класс SendGridEmail:

require 'sendgrid-ruby'
include SendGrid

class SendGridEmail

  def initialize 
  end

  def send_message
    mail = Mail.new
    mail.from = Email.new(email: 'test@example.com')
    mail.subject = 'I\'m replacing the subject tag'
    personalization = Personalization.new
    personalization.add_to(Email.new(email: 'cannon.moyer@treadmilldoctor.com'))
    personalization.add_substitution(Substitution.new(key: '-name-', value: 'Example User'))
    personalization.add_substitution(Substitution.new(key: '-city-', value: 'Denver'))
    mail.add_personalization(personalization)
    mail.add_content(Content.new(type: 'text/html', value: 'I\'m replacing the <strong>body tag</strong>'))
    mail.template_id = '7fd8c267-9a3c-4093-8989-3df163e87c47'

    sg = SendGrid::API.new(api_key: "xxxxxxxxxxxxxxxxxxxxxx")
    begin
        response = sg.client.mail._("send").post(request_body: mail.to_json)
    rescue Exception => e
        puts e.message
    end
    puts response.status_code
    puts response.body

    puts response.headers
  end

  def create_notification
    @customer.notifications.create(name: "Manually Text Job to Customer", to: "+1", notification_type: "Manual Job Notification")
  end
end

1 Ответ

0 голосов
/ 29 мая 2018

Использование include портит пространства имен, поэтому лучше просто не делать этого.Ruby имеет единое глобальное пространство имен в отличие от таких вещей, как Python и Node, поэтому вам нужно быть очень осторожным при импорте.

Если у вас include SendGrid и у него есть класс SendGrid::Attachment, то Ruby попытается согласовать это сваш класс Attachment позже, который потерпит неудачу.

Лучший план - обновить ваш код, добавив префикс SendGrid:: во все.Хорошо спроектированная библиотека будет чисто пространством имен, чтобы избежать этой проблемы.

...