Bundle неправильно импортирует гем gnuplot;NameError: неинициализированная константа, генерируемая при доступе - PullRequest
2 голосов
/ 24 августа 2011

У меня есть модуль, который живет в моем приложении Rails как lib / render_graphs.rb.Это выглядит так:

require 'gnuplot'
module RenderGraphs
  def render_standard_curve_graph(standard_curve, params, term = nil, output = nil)
    Gnuplot.open do |gp|
      # do things
    end
  end
end
if __FILE__ == $0
  include RenderGraphs
  render_standard_curve_graph(...)
end

Если я вызову его в командной строке с ruby -r rubygems render_graphs.rb, все будет работать нормально.Но если я пытаюсь вызвать render_standard_curve_graph из моего приложения Rails (я вызываю его из контроллера, который включает в себя RenderGraphs) или из консоли Rails, это выдает ошибку вроде:

NameError: uninitialized constant RenderGraphs::Gnuplot
        from .../lib/render_graphs.rb:31:in `render_standard_curve_graph'
        from (irb):32

Если я запускаю require '/Library/Ruby/Gems/1.8/gems/gnuplot-2.3.6/lib/gnuplot.rb'на консоли Rails, прежде чем я вызову render_standard_curve_graph, он работает просто отлично.Что не так с gem 'gnuplot' в моем Gemfile?bundle show gnuplot приводит к /Library/Ruby/Gems/1.8/gems/gnuplot-2.3.6...

Я сбит с толку.gnuplot находится в моем Gemfile, и я запустил пакетную установку и перезапустил консоль (несколько раз).Подобные вызовы других гемов (GSL и roo) прекрасно работают из других модулей в моей директории lib.Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 27 сентября 2011

Это ошибка в самоцвете GSL.Драгоценный камень GSL должен быть загружен после гема gnuplot, иначе он не позволяет модулю Gnuplot появляться в интерпретаторе.Bundler не поддерживает обязательные гемы в определенном порядке, поэтому исправление, не требующее изменения гемов gsl, заключается в редактировании config / boot.rb и явном require 'gnuplot' сразу после require 'rubygems' до инициализации Bundler.

0 голосов
/ 23 июля 2014

Вздох. Наука о данных - это очень сложно.

У меня был код как

require "gsl"
# prepare data
# ...
require "gnuplot"
# plot data
# ...

И я получал NameError: uninitialized constant Gnuplot

Я превратил это в

require "gnuplot"
require "gsl"
# prepare data
# ...
# plot data
# ...

И ошибка исчезла.

0 голосов
/ 24 августа 2011

Вы можете попытаться быть явным и всегда получать Gnuplot константу с верхнего уровня. (Когда вы запускаете его в командной строке, вы включаете RenderGraphs в верхний уровень, и render_standard_curve_graph может искать Gnuplot на этом уровне.)

module RenderGraphs
  def render_standard_curve_graph(standard_curve, params, term = nil, output = nil)
    ::Gnuplot.open do |gp|
      # do things
    end
  end
end
...