Rails模型名称与包含的gem冲突

时间:2017-01-06 15:07:29

标签: ruby-on-rails ruby ruby-on-rails-5

我们一直在嘲笑我们的电子邮件工作,直到我们真正将SendGrid Gem包含在工作人员的顶端

require 'sendgrid-ruby'
include SendGrid

class Notifications::WelcomeWorker
  include Sidekiq::Worker

  def perform(email_id)

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

问题似乎出现了,因为SendGrid在(电子邮件)

中具有相同的模型

因此生成消息

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

我尝试通过ApplicationRecord :: Email调用电子邮件,以更具针对性,但无济于事。

所有SO和其他指南通常都会改变我们的模型名称,但我觉得必须有更好的方法。为了清楚起见,我们正在运行Rails 5,所以我想知道是否有一个更新它来解决这个问题,我根本找不到它。

1 个答案:

答案 0 :(得分:5)

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::前缀。