【问题标题】:Put gem class into namespace将 gem 类放入命名空间
【发布时间】:2023-03-15 07:40:02
【问题描述】:

在我的 Rails Gemfile 中,我添加了一个新的 gem。它是这样使用的:

Email::Client

我现在遇到的问题是我的 rails 应用程序中还有一个名为 Email 的类。现在有时当我尝试初始化它时,我会收到以下错误:

Email.new # >> undefined method 'new' for Email:Module

可能是因为 Email 是 gem 中的 Module。我该如何解决这个问题?有没有办法命名gem模块?我不想重命名我的电子邮件类。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4


    【解决方案1】:

    我不想重命名电子邮件类。

    然而,这是你必须要做的。您的代码是您唯一可以控制的东西。重命名/别名 (MyEmail) 或命名空间 (MyApp::Email)。

    顺便说一句,你这次轻松了。想象一下如果另一个Email 也是一个类会发生什么。突然间,你所有的方法都没了。您添加或更改了一种方法,但您的电子邮件看不到它。这可能会导致令人沮丧的调试会话。

    【讨论】:

    • require: false 在 gemfile 中,或 EmailModel = Email.dup 在初始化程序中会有帮助吗? stackoverflow.com/a/4140516/6548745
    • require: false 只会延迟问题。 最终将需要gem(否则为什么要包含它)并且会导致名称冲突然后。不确定您的dup 提案,它的用途是什么?您可以简单地通过 EmailModel = Email 来别名,但如果我们这样做,为什么不直接去重命名模型?
    • 我编辑以共享参考,如果别名有效,那不是比迁移更好吗?
    • @Md.FarhanMemon 不需要迁移,我们可以保留表名(虽然现在无法猜测,需要明确指定)。但是,是的,我们可以使用别名。
    • 是的,命名空间也是一种替代迁移的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2015-03-03
    • 2012-06-30
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多