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

时间:2011-03-22 19:43:00

标签: ruby-on-rails rspec2 capybara

我正在使用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 => ...)? :)

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

不幸的是,路由生成发生在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

答案 2 :(得分:2)

我正在运行rails 3.2.6,我在Phoet的评论下使用了我在https://github.com/rspec/rspec-rails/issues/255找到的技术。只需将其放在/ 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

答案 3 :(得分:-1)

使用带有RSpec的Capybara 下的here对面,我能够让它工作的唯一方法是编写

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

所以对你而言

visit dossier_path(:id => "1")

有效吗?