【问题标题】:Why isn't this rails gem being loaded in production on unicorn?为什么这个 rails gem 没有在 unicorn 的生产环境中加载?
【发布时间】:2014-09-02 15:44:54
【问题描述】:

我在 Ruby on Rails 应用程序中使用 humanize_boolean gem。

gem 对我来说非常有用,除了一个重要的地方,那就是我的生产网络服务器。我不会因为我的问题而责怪这颗宝石,但我很乐意在这里提供其他人的眼球可以提供的任何帮助。

在视图模板中,我使用humanize。但我明白了

ActionView::Template::Error (undefined method `humanize' for true:TrueClass):

确实,humanize_boolean gem 没有被包括在内。我可以知道当我使用$LOADED_FEATURES 时,humanize_boolean.rb 不在列表中,尽管它正在开发中。

以下内容让我相信它应该可以工作:

  • 当我使用像RAILS_ENV=production rails c 这样的生产控制台时,它可以工作。例如。 true.humanize 按预期打印“是”。
  • 在我的 Gemfile 中,我的 gem 'humanize_boolean' 不在任何组中。因此,在生产中应该需要它。
  • 它适用于由 Sidekiq 在生产中发送的电子邮件的电子邮件模板。

我使用 unicorn 作为应用服务器。

如果我手动要求控制器中的文件,它可以工作。例如

require '/home/ubuntu/app/shared/bundle/ruby/2.0.0/gems/humanize_boolean-0.0.1/lib/humanize_boolean/version.rb'
require '/home/ubuntu/app/shared/bundle/ruby/2.0.0/gems/humanize_boolean-0.0.1/lib/humanize_boolean.rb'

class ClientsController < ApplicationController
...

此外,如果我在生产中使用 webrick,它也可以工作,例如

$ RAILS_ENV=production rails s

所以不知何故这是独角兽的问题,但我没有其他此类问题。奇怪。

【问题讨论】:

  • 没有充分的理由。特别是当它在 Sidekick 中工作时。您是否尝试将其关闭再打开?
  • 最终成功了。我不知道我做了什么。我发誓我已经多次重启了独角兽,包括至少一次从 capistrano 进行的全面部署。

标签: ruby-on-rails gem require unicorn


【解决方案1】:

尝试将其添加到您的 unicorn.rb 文件中:

before_exec do |server| 
  ENV["BUNDLE_GEMFILE"] = "/path/to/app/current/Gemfile" 
end

这应该确保在 unicorn 启动之前加载 gemfile。

【讨论】:

  • 嘿迈克。我确信它正在加载我的 Gemfile,因为其他所有 gem 都加载得很好。
  • 我只是想看看这是否有效......我无法在这里复制您的问题。我运行的是什么版本的 rails 和 unicorn?
  • 对不起。需要明确的是,这不是问题,因为我更新了我的问题。但以防万一我使用的是 Rails 4.1.0 和 Unicorn 4.6.2。感谢您对此的意见!
  • 谢谢。我已经看到 Unicorn(有时)在生产中无法在 gemfile 中加载 gem 的地方。它似乎与某种环境缓存有关,重新启动一切通常会修复它。如果您想在将来确定防止这种情况发生,您可以添加我发布的 before_exec 块,再也不用担心它;)
  • 我今天添加了另一个 gem (constructor)。独角兽也有同样的问题,虽然这次是用这个新宝石,而不是人性化宝石。所以作为猜测,它有一些gemfile缓存。你的解决方案对我有用。
【解决方案2】:

这并没有具体回答您的问题,但我建议您跳过 gem 并使用帮助器:

def human_boolean(boolean)
  boolean ? "Yes" : "No"
end

human_boolean(true)
# => "Yes"

human_boolean(false)
# => "No"

我只是建议这样做,因为对于这么简单的一段代码来说,gem 已经被压倒了。

【讨论】:

  • 有什么理由会被认为是“过强”?它本质上只是读取另一个文件然后解析它。尽管我不使用 i18n 功能,但在可能的情况下使用 gem 似乎很棒,因为其他人会维护和测试它们。
  • @TylerCollier 我认为它过于强大,因为 gem 可以在 3 行中实现。更少的代码,更少的维护代码,更少的测试代码,更明确和更容易在你的助手中访问。在可能的情况下利用其他人的代码绝对是明智的,但在您可以在 10 秒内实现相同的事情的情况下则不然。
  • 您甚至可以在一行中实现 i18n 功能。这是一个如此简单的案例,没有理由使用宝石。这是另一个依赖项,为了 3 行增加了启动时间和内存消耗?取舍是不值得的。如果您使用助手(不应该需要任何东西——它们会自动加载),那么您甚至不会在这个问题上浪费时间,因为它本来就是有效的。
  • 只是要把它扔在那里(我可能有偏见).. 但是,gem 支持 i18n 并直接为 TrueClass 和 FalseClass 提供人性化功能,这意味着它可以在应用程序的任何位置使用并遵循主动支持为字符串提供的“人性化”范式。如果你把它放在一个 helper 中,它在控制器或模型中将不可用,除非你包含那个 helper。当然,可能没有理由将它包含在其中,但以我的拙见,将它作为一个 gem 是包含此类功能的更清洁的解决方案,并遵循既定的“人性化”范式。
  • 是的,你有偏见;)如果这是“人性化”范式的自然发展,为什么不将其添加到 Rails 核心中?
猜你喜欢
  • 2022-10-26
  • 1970-01-01
  • 2015-08-19
  • 2013-10-24
  • 2012-04-21
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2014-06-15
相关资源
最近更新 更多