0

我正在为 Comatose 开发一个 Rails 3.2.8 引擎,用于开发 Rails 引擎的一些练习。我遇到了一个奇怪的问题,我想知道是否还有其他人也遇到过。主要问题在于ActionDispatch::Routing::RouteSet#eval_block。当方法调用 Mapper.new 时,出现“参数数量错误(0 为 1)”的异常。这是当前定义:

def eval_block(block)
  if block.arity == 1
    raise "You are using the old router DSL which has been removed in Rails 3.1. " <<
              "Please check how to update your routes file at: http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/"
  end
  mapper = Mapper.new(self)
  if default_scope
    mapper.with_default_scope(default_scope, &block)
  else
    mapper.instance_exec(&block)
  end
end

从调试器断点来看,Mapper 是 ActionDispatch::Routing::RouteSet::Mapper,而不是 ActionDispatch::Routing::Mapper。但是,我在任何地方都找不到 ActionDispatch::Routing::RouteSet::Mapper 定义。

我不知道是否正在发生一些动态的 Ruby/Rails 魔术,其中 Mapper 实际上是由某个 gem 在 RouteSet 中定义的。我似乎无法追踪它,我已经在整个 gemset 中搜索了“Mapper”,但找不到任何东西。

实际上,我必须在我的代码中使用 test/dummy/config/initializer 中的初始化程序创建一个解决方法,以便 Mapper 完全合格。

::ActionDispatch::Routing::RouteSet.class_eval do
    def eval_block(block)
      if block.arity == 1
        raise "You are using the old router DSL which has been removed in Rails 3.1. " <<
                  "Please check how to update your routes file at: http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/"
      end
      mapper = ::ActionDispatch::Routing::Mapper.new(self)
      if default_scopeSo, 
        mapper.with_default_scope(default_scope, &block)
      else
        mapper.instance_exec(&block)
      end
    end
end

我以前在其他项目中从未遇到过这个错误。这是我在框架内测试引擎的第一次尝试,但我之前在其他项目中使用过引擎。代码在 Rails 3.2.7 中看起来也一样。

有没有其他人遇到问题或者我做错了什么?我正在使用 Ruby 1.9.3-p194、Rails 3.2.8,当然还有很多 gem。我在完全更新的 Ubuntu 12.04 上,并使用 RVM。捆绑器中的宝石说我正在使用如下:

Using rake (0.9.2.2) 
Using RedCloth (4.2.9) 
Using i18n (0.6.1) 
Using multi_json (1.3.6) 
Using activesupport (3.2.8) 
Using builder (3.0.1) 
Using activemodel (3.2.8) 
Using erubis (2.7.0) 
Using journey (1.0.4) 
Using rack (1.4.1) 
Using rack-cache (1.2) 
Using rack-test (0.6.1) 
Using hike (1.2.1) 
Using tilt (1.3.3) 
Using sprockets (2.1.3) 
Using actionpack (3.2.8) 
Using mime-types (1.19) 
Using polyglot (0.3.3) 
Using treetop (1.4.10) 
Using mail (2.4.4) 
Using actionmailer (3.2.8) 
Using arel (3.0.2) 
Using tzinfo (0.3.33) 
Using activerecord (3.2.8) 
Using activeresource (3.2.8) 
Using acts_as_list (0.1.8) 
Using acts_as_tree (1.1.0) 
Using acts_as_versioned (0.2.3) 
Using bundler (1.2.0) 
Using cocaine (0.3.0) 
Using columnize (0.3.6) 
Using rack-ssl (1.3.2) 
Using json (1.7.5) 
Using rdoc (3.12) 
Using thor (0.16.0) 
Using railties (3.2.8) 
Using jquery-rails (2.1.1) 
Using rails (3.2.8) 
Using comatose (0.0.1) from source at . 
Using daemons (1.1.9) 
Using debugger-ruby_core_source (1.1.3) 
Using debugger-linecache (1.1.2) 
Using debugger (1.2.0) 
Using eventmachine (0.12.10) 
Using liquid (2.4.1) 
Using paperclip (3.1.4) 
Using responds_to_parent (1.1.0) 
Using sqlite3 (1.3.6) 
Using test-unit (2.5.2) 
Using thin (1.4.1) 

这是用 Rails 提出的问题吗?如果是,我在哪里做?对于我不理解的Ruby,这是一个被误解的范围规则吗?比如,为什么 Mapper 引用 ActionDispatch::Routing::RouteSet 模块中不存在的类而不是引用 ActionDispatch::Routing 模块中的 Mapper 类?

谢谢,-极地

4

1 回答 1

0

我刚刚遇到了同样的问题。

就我而言,它是由具有以下代码的旧插件(savage-beast)引起的:

class ActionController::Routing::RouteSet::Mapper
  def from_plugin(name)
    eval File.read(File.join(RAILS_ROOT, "vendor/plugins/#{name}/routes.rb"))
  end
end

这导致了问题。也许这会有所帮助。我认为问题的出现是因为旧的 RAILS_ROOT 而不是 Rails.root

于 2013-03-05T22:33:55.903 回答