【问题标题】:Using ActiveSupport::Inflector with a class conflict使用带有类冲突的 ActiveSupport::Inflector
【发布时间】:2020-12-15 12:40:21
【问题描述】:

SendGrid 设置变形意味着我们可以对 Rails 的文件命名方案进行例外处理。我们可以将模型命名为SendGrid...,而不必将文件命名为send_grid_...。但是,它在此处引入了与依赖项相关的问题。我正在使用sendgrid-actionmailer gem,它使用模块名称ActionMailbox::Ingresses::Sendgrid 注册入口,但前面的首字母缩写词定义意味着查找需要SendGrid

config/initializers/inflections.rb:

# frozen_string_literal: true

ActiveSupport::Inflector.inflections(:en) do |inflect|
  ...
  inflect.acronym 'SendGrid'
end

在生产中运行时,我使用 sendgrid-actionmailer:

/app/vendor/bundle/ruby/2.7.0/gems/actionmailbox-6.0.3.2/app/controllers/action_mailbox/ingresses/sendgrid/inbound_emails_controller.rb:47:in `<module:ActionMailbox>': uninitialized constant ActionMailbox::Ingresses::Sendgrid (NameError)
Did you mean?  ActionMailbox::Ingresses::SendGrid
SendGrid

A maintainer suggests this problem relates more to ActiveSupport than sendgrid-actionmailer,我同意。他建议对此的临时解决方案是删除首字母缩写词声明并改用 Sendgrid。有没有更永久的解决方案可以让我们保留首字母缩写词声明?

【问题讨论】:

  • ActionMailbox::Ingresses::Sendgrid 的定义是什么?
  • Rails 的actionmailbox 模块 - 代码是here

标签: ruby-on-rails ruby


【解决方案1】:

ActiveSupport::Inflections 上定义变形会影响全局加载它们的方式。感谢Rails docs,我发现您可以覆盖 Rails 加载器上的变形。我最终需要将以下内容添加到初始化程序(config/initializers 下的.rb 文件):

# frozen_string_literal: true

Rails.autoloaders.each do |autoloader|
  autoloader.inflector.inflect(
    'sendgrid' => 'Sendgrid'
  )
end

这会恢复加载程序所知道的默认值。

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多