2011-03-22 56 views
9

我使用rails 3.0.5,rspec2和最新的水豚。使用水豚时路径无法正常工作

路线设置,如:

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) 

但无论是丑陋的,看起来像一个肮脏的黑客工作。那么,为什么我需要使用这种肮脏的黑客攻击以及我该做什么,这样我就可以像在视图中一样使用路径方法(因此不需要添加nil或显式传递:id =>的肮脏黑客攻击。 ..)? :)

+0

你的问题的标题表明这是一个答案,而不是一个问题。阅读内容后,这种印象并没有太大变化。你在找什么? – polarblau 2011-03-22 21:16:29

+0

我正在寻找一个答案,为什么我需要使用我展示的肮脏破解和我能做的事情,以便我可以像使用视图一样使用方法(所以不需要添加nil或显式传递的肮脏破解: id => ...)。 – gucki 2011-03-23 07:20:52

+0

对不起,我刚刚看到标题错了。而不是“现在”它应该是“不”,我只是修复它;) – gucki 2011-03-23 07:23:44

回答

-1

对面使用水豚使用RSpec的唯一途径下,如图here我已经能够得到它的工作是写

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

所以对你来说应该

visit dossier_path(:id => "1") 

它工作吗?

+0

对不起,我没有看到这是如何与我的问题有关的默认url选项没有被使用? – gucki 2011-07-20 08:42:49

2

不幸的是,路由生成发生在应用程序控制器之外。而且水豚不会提供任何魔法来提供默认的URL选项来帮助路由器。

但是你可以指定默认区域设置你的routes.rb

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

里面现在,如果你不及格:区域设置选项的路线助手则默认为"es"。实际上,您不必在控制器中保留def default_url_options

+1

例如,依赖于current_user的默认值如何? – gucki 2011-08-18 08:02:39

+0

这是个不好的答案,即使我一开始就投了票。它会让你的测试通过,但是应用程序本身的一半链接被默认的语言环境所困住。 – firedev 2014-01-21 14:08:42

7

我遇到了类似的问题。您可以设置在这样的前块default_url_options的要求规格:

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

只是为了增加更多的上下文:上面的代码应该在'Rspec.configure do | config |'块中的某处。 – Lenart 2015-01-05 13:35:25

2

我运行轨道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