我在Rails引擎中有一个请求规范。呈现的视图调用路由并传入散列,即projects_path(:scope => "user")
。像这样的路线最终会调用url_for
,但url_for
会在很多地方定义。在主应用程序(根级别)中运行应用程序或运行请求规范时,调用链最终在ActionView::RoutingUrlFor#url_for
;但是,在引擎中运行规范时,调用链最终会在ActionView::Helpers::UrlHelper#url_for
。
在Rails 4中,url_for
中定义的UrlHelper
方法不再接受哈希参数,所以我留下了这个错误
Failure/Error: visit projects_opportunity_intakes_path
ActionView::Template::Error:
arguments passed to url_for can't be handled. Please require routes or provide your own implementation
我想弄清楚的是,当我在我的引擎中运行规范时,为什么它会重新回到ActionView::Helpers::UrlHelper
,而不是在任何其他情况下。这非常令人困惑。有一点让我很突出:当我在我的视图中放置一个断点并评估self.class
时,我通常会获得从ActionView::Base
继承的东西,但是当我运行一个规范时从我的引擎,该类不会继承任何东西。我不知道这是否相关,但看起来很可疑。
有人经历过这个吗?知道解决方法吗?我的模块可能被包含在错误的顺序中吗?是否有spec_helper
或虚拟应用初始化中的某些内容可以确保正确使用正确的模块?
答案 0 :(得分:18)
我在更新到Rails 4时遇到了同样的问题,我发现问题是包含以下行的模型:
include Rails.application.routes.url_helpers
尝试在您的应用程序中查找包含url_helpers
某处的代码。删除该行应该有助于解决问题。
答案 1 :(得分:6)
我认为问题在于include ActionView::Helpers
和include Rails.application.routes.url_helpers
相互冲突。
我发现如果你先放ActionView::Helpers
,它就不会引起错误。所以改变
include Rails.application.routes.url_helpers
include ActionView::Helpers
到
include ActionView::Helpers
include Rails.application.routes.url_helpers
答案 2 :(得分:2)
包括ActionView :: Helpers :: UrlHelper - >就我而言,这是我必须搜索和评论的界限。
答案 3 :(得分:0)
对我来说,问题是由于将散列作为link_to行的第二个参数传递而引起的。
<%= link_to('click me', {one: params[:one], two: params[:two]}) %>
在页面的实际路径方法中包装哈希值以解决问题
<%= link_to('click me', actual_path({one: params[:one], two: params[:two]})) %>
答案 4 :(得分:0)
如果有人滚动到这里...
在类中包含 Rails.application.routes.url_helpers
将防止您的测试失败。
所以改变
include Rails.application.routes.url_helpers
class SomeClass
# methods
end
进入
class SomeClass
include Rails.application.routes.url_helpers
# methods
end