我正在使用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 => ...)? :)
答案 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")
有效吗?