2011-12-30 43 views
3

什么是正确的方式来处理相同名称的红宝石源文件,并确保正确的文件由给定的require语句加载?红宝石源文件名冲突与'要求'

背景

我想利用ruby-geometry宝石在我的Rails应用程序3。

我试图利用红宝石几何Polygon类:

require 'geometry' # the main ruby-geometry gem file 

module SomeModule 
    def SomeMethod(vertices) 
     polygon = Geometry::Polygon.new(vertices) 

     # Do some stuff with polygon... 
    end 
end 

但是,每当我尝试运行这段代码,我得到了以下错误:

NameError: uninitialized constant Geometry::Polygon

这很奇怪,因为我似乎能够在没有问题的情况下与任何其他ruby几何类一起工作(例如Geometry::Point,Geometry::Segment)。

的问题

的问题是,我的应用程序包含一个名为so does the ruby-geometry gem一个polygon.rb源文件(包含ActiveRecord模型)和。所以,当红宝石几何宝石requires its own polygon.rb它最终加载我的应用程序的polygon.rb而不是。据推测,这完全取决于ruby通过目录搜索的顺序。

什么是解决命名冲突的“正确”方法?

显然代码您可以使用模块来区分名称空间来解决类名称冲突。 require -ing他们之间有一种简单的方法来区分同名的源文件吗?

+0

你不能重命名你的代码文件吗?为什么这不是一种选择?这将是最简单的方法。重命名它'polygon_record.rb'或类似的东西。 – Linuxios 2011-12-30 17:55:22

+1

同意这是一个选项,它似乎这样做是承认'require'机制被破坏。我应该能够命名源文件,但我希望不必确保该名称不会与我的应用所依赖的n个宝石中的任何源文件冲突。另外,如果碰撞发生在两个宝石的源文件之间(我不能轻易重命名)呢?我不相信没有更好的解决方案。 – tomtheguvnor 2011-12-30 18:08:35

+0

我想,如果你真的不想重命名你的模型,你总是可以要求该文件的绝对路径,但我不会推荐它 – 2011-12-30 18:33:16

回答

1

恕我直言,这是在几何 gem实现中的错误。它依靠$LOAD_PATH环境变量来决定其请求的文件在哪里。我宁愿使用require_relative或使用File.dirname(__FILE__)值来要求我的宝石中有相对路径文件。

为了解决您的问题,您可以需要几何宝石之前Rails的是增加自身的路径的$LOAD_PATH环境变量。要做到这一点

的一种方式已经工作对我来说是明确要求这种宝石在GEMFILE

gem "ruby-geometry", :require => "geometry" 

另一种方式是之前需要几何宝石从$LOAD_PATH阵列删除您app/models路径:

old_load_path = $LOAD_PATH 
$LOAD_PATH.delete(File.expand_path("#{Rails.root}/app/models")) 
require "geometry" 
$LOAD_PATH.replace(old_load_path) 

但是,这是丑陋的地狱。

+0

谢谢。你的Gemfile破解伎俩。我会看到有关创建一个修补宝石和通过拉请求发送。 – tomtheguvnor 2012-01-01 11:31:32