2017-01-06 4 views
1

Мы насмешливыми наши электронной почтой рабочих мест с успехом, пока мы фактически не включили наш SendGrid Gem в верхней части нашего работникаRails модель конфликт имен с включенной жемчужиной

require 'sendgrid-ruby' 
include SendGrid 

class Notifications::WelcomeWorker 
    include Sidekiq::Worker 

    def perform(email_id) 

    emailAddr = Email.find(email_id) 
    ... 
    end 
end 

Проблема, кажется, возникает потому, что SendGrid имеет та же модель в (E-mail)

таким образом генерируя сообщение

undefined method `find' for SendGrid::Email:Class 

Я пытался дозвониться Email через ApplicationRecord :: Email более зависит от конкретных условий, но безрезультатно.

Все SO и другие руководства обычно меняют название нашей модели, но я чувствую, что должен быть лучший способ. Чтобы быть ясным, мы запускаем Rails 5, поэтому мне интересно, было ли в них обновление, чтобы решить эту проблему, которую я просто не нашел.

+1

Вы действительно должны «включать SendGrid»? Это кажется довольно инвазивным. – Stefan

+0

Ну, я полагаю, у нас есть возможность построить свою собственную библиотеку, а не использовать их. Это было просто быстрее с точки зрения развития, чтобы использовать их Gem - это зависит от того, как сделать наше название модели другим. Я делаю панорамирование, чтобы создать отдельную проблему с сопровождающими GGG SendGrid. – CogitoErgoSum

+1

Это не то, что я имел в виду :-) Иначе говоря: что произойдет, если вы удалите строку 'include SendGrid'? – Stefan

ответ

3

include SendGrid Это преступник.

Он добавляет все константы модуля SendGrid к текущему модулю (что, вероятно, относится к верхнему уровню), поэтому вы можете использовать классы SendGrid без префикса, например. только Email.new вместо SendGrid::Email.new.

Недостатком является то, что он также вмешивается в ваши существующие константы.

Вы можете либо включить его под конкретный модуль:

class Notifications::WelcomeWorker 
    include Sidekiq::Worker 
    include SendGrid 

    # ... 
end 

Затем Email решает Sendgrid::Email и ::Email решает верхнего уровня, Email класса.

Или вы можете просто удалить строку include SendGrid и использовать префикс SendGrid::.

+0

Для большей ясности для других мы решили отказаться от включения SendGrid и использовать префикс SendGrid, поскольку это намного более явное в коде, когда люди его просматривают. – CogitoErgoSum

Смежные вопросы