使用水豚时路径不能正常工作

我正在使用rails 3.0.5,rspec2和最新的capybara。

路线设置如下:

scope "(:locale)", :locale => /de|fr|it|en/ do resources :dossiers end 

在application_controller我有这个:

 def default_url_options(options={}) options[:locale] = "es" options end 

所以在我看来我可以使用

 link_to 'test', dossier_path(1) 

没有任何问题。

但是当我在capybara的访问中做同样的事情时,它会尝试使用1作为语言环境而不是id。 它只在我使用时才有效

 visit dossier_path(nil, 1) 

要么

 visit dossier_path(:id => 1) 

但两者都是丑陋的,看起来像一个肮脏的黑客。 那么为什么我需要使用这个脏的hack以及我要做什么,以便我可以像在视图中一样使用路径方法(所以没有必须添加nil或显式传递的脏黑客:id =>。 ..)? 🙂

我遇到了类似的问题。 您可以在请求规范中的before块中设置default_url_options:

  before :each do app.default_url_options = { :locale => :es } end 

不幸的是,路由生成发生在Application Controller之外。 并且Capybara没有做任何魔术来提供默认的URL选项来路由助手。

但是您可以在routes.rb中指定默认语言环境

 scope "(:locale)", :locale => /de|fr|it|en/, :defaults => { :locale => "es" } do resources :dossiers end 

现在如果你没有将locale选项传递给路由助手,它将默认为"es" 。 实际上,没有必要在控制器中保留def default_url_options

我正在运行rails 3.2.6并且我使用了一种技术,我在这里找到了https://github.com/rspec/rspec-rails/issues/255 ,这是Phoet的评论。 只需将它放在/ spec / support中,它应该涵盖所有规格

 class ActionView::TestCase::TestController def default_url_options(options={}) { :locale => I18n.default_locale } end end class ActionDispatch::Routing::RouteSet def default_url_options(options={}) { :locale => I18n.default_locale } end end 

如下所示, 使用带有RSpec的Capybara ,我能够让它工作的唯一方法就是写作

 visit user_path(:id => myuser.id.to_s) 

所以对你来说应该

 visit dossier_path(:id => "1") 

它有用吗?