首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能阻止Ruby将目标锁定在gem的类而不是我的类?

我怎样才能阻止Ruby将目标锁定在gem的类而不是我的类?
EN

Stack Overflow用户
提问于 2021-03-15 15:11:41
回答 1查看 39关注 0票数 1

我在使用官方SendGrid创业板的Rails代码库中遇到了问题。同一行为有两个单独的实例正在发生。

第一个例子

我有一个Engine类:

代码语言:javascript
复制
module API
  class Engine < ::Rails::Engine
    isolate_namespace API
  end
  ...
end

在我的路线中,我经常这样指那个班:

代码语言:javascript
复制
mount API::Engine, at: :api, as: :api

...but --我偶尔会遇到这样的错误:uninitialized constant SendGrid::API:Engine。(我的意思是“偶尔”;它似乎是在开发过程中随机发生的,刷新可以修复它。)所以,我把台词改为:

代码语言:javascript
复制
mount ::API::Engine, at: :api, as: :api

我认为这应该明确地针对我的API,而不是SendGrid,但在开发过程中,当我处理与SendGrid相关的代码时,我仍然偶尔会遇到错误。

第二个例子

这个看起来更奇怪。这个问题这个星期刚刚出现,让我意识到上面的例子并不是孤立的事件。

我有一个Response类:

代码语言:javascript
复制
class Survey::Response < Sequel::Model Sequel[:survey][:responses]
  ...
end

我们的监控刚刚发现了这个错误:

代码语言:javascript
复制
NoMethodError
undefined method `[]' for SendGrid::Response:Class

..。在这条线上:

代码语言:javascript
复制
results = results.pluck(:response_id).uniq.map { |r| Survey::Response[r] }

这个例子看起来更加极端,因为我们明确地针对Survey::Response,而显然不是针对SendGrid::Response

问题

我很想知道是什么导致了这件事,但大多数时候我想知道如何阻止它。如何100%确保一行针对的是我的类而不是sendgrid-ruby gem的类?

我确实找到了这个问题,这与我在第一个问题中得出的结论是一样的,尽管这个问题已经解决了,而我的问题却没有解决。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-16 20:55:15

我的问题是,全局命名空间中包含了一个模块,因此它的常量正在污染整个代码库。

例如:

代码语言:javascript
复制
require 'sendgrid-ruby'
include SendGrid

module MyModule
  ...
end

以这种方式包括SendGrid可能会导致我问题中描述的问题。以这种方式包括任何创业板都有可能引起类似的问题。

解决方案是只包括必须包含的模块,例如:

代码语言:javascript
复制
require 'sendgrid-ruby'

module MyModule
  include SendGrid
  ...
  # I can refer to Email here, and it will target SendGrid::Email
  ...
end

..。或者更好的是,根本不包括模块,而是显式地引用模块的类:

代码语言:javascript
复制
require 'sendgrid-ruby'

module MyModule
  ...
  # Instead of referring to Email, I must explicitly refer to SendGrid::Email
  ...
end

这个问题帮助我认识到了这个问题。但是因为这个问题在我的搜索中没有出现,所以我会把这个问题留给未来的旅行者回答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66640638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档