在Rails引擎规范中使用正确的url_for方法

时间:2013-12-18 14:19:06

标签: ruby-on-rails rspec routing ruby-on-rails-4 rails-engines

我在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或虚拟应用初始化中的某些内容可以确保正确使用正确的模块?

5 个答案:

答案 0 :(得分:18)

我在更新到Rails 4时遇到了同样的问题,我发现问题是包含以下行的模型:

include Rails.application.routes.url_helpers

尝试在您的应用程序中查找包含url_helpers某处的代码。删除该行应该有助于解决问题。

答案 1 :(得分:6)

我认为问题在于include ActionView::Helpersinclude 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