0

我有一个安装在 Rails 4 上的引擎MyEngine

lib模块内部,我使用url_helper来查找路线。

MyEngine::Engine.routes.url_helpers.send("test_controller_url",{:id => 1, :lang => I18n.locale})

我已经像这样配置rspecdefault_url_optionsin spec/spec_helper.rb

class ActionView::TestCase::TestController
  def default_url_options(options={})
    { :params => { :lang => I18n.default_locale }, :host => "test.host" }.merge options
  end
end

class ActionDispatch::Routing::RouteSet
  def default_url_options(options={})
    { :params => { :lang => I18n.default_locale }, :host => "test.host" }.merge options
  end
end

url我期待的结果是:

http://test.host/controller/1/test?lang=en

但我得到了url

http://test.host/?lang=en/controller/1/test?lang=en

我对actionpack/action_dispatch/http/url.rbin actionpack-4.0.1of进行了一些调试rails

url_for方法的选项是:

{
  :params=>{:lang=>:en}, 
  :host=>"test.host", 
  :use_route=>"my_engine", 
  :only_path=>true, 
  :lang => :en, 
  :path=>"/", 
  :script_name=>nil, 
  :user=>nil, 
  :password=>nil
}

{
  :params=>{:lang=>:en}, 
  :host=>"test.host", 
  :action=>"test", 
  :controller=>"my_engine/controller", 
  :use_route=>"test_controller", 
  :only_path=>false, 
  :id=>1, 
  :path=>"/controller/1/test", 
  :script_name=>"/?lang=en", 
  :user=>nil, 
  :password=>nil
}

dummy里面的rails应用程序中,spec/dummy/config/routes.rb我安装了engine

mount MyEngine::Engine, :at => "/"

它似乎只产生畸形urlrspec甚至不产生rails console

我还注意到有两个调用url_for,一个用于 the engine,一个用于实际path

我在这里做错了什么?是配置问题还是存在实际错误?

4

1 回答 1

0

删除:paramsand:lang就可以default_url_options了。

于 2013-11-15T07:38:18.053 回答