Using the correct url_for method in a Rails engine spec

Viewed 10345

I have a request spec in a Rails engine. The view that is rendered calls a route and passes in a hash, i.e. projects_path(:scope => "user"). A route like this will eventually call url_for, but url_for is defined in many places. When running the application or running a request spec in the main app (root level), the call chain ends up at ActionView::RoutingUrlFor#url_for; when running a spec in the engine, however, the call chain ends up at ActionView::Helpers::UrlHelper#url_for.

In Rails 4, the url_for method defined in UrlHelper no longer accepts hash arguments, so I'm left with this error

 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

What I'm trying to figure out is why the heck it's falling back on ActionView::Helpers::UrlHelper when I run a spec in my engine, but not in any other case. This is quite perplexing. One thing that stands out to me: when I put a breakpoint in my view and evaluate self.class, I normally get something that inherits from ActionView::Base, but when I run a spec from my engine, the class doesn't inherit from anything. I don't know if that's related, but it seems fishy.

Anyone experience this? Know a way around it? Could my modules be getting included in the wrong order? Is there something in spec_helper or in the dummy app initialization that I can do to make sure that the right modules are being used?

5 Answers

For me, the issue was caused by passing a hash as the second argument of a link_to line.

<%= link_to('click me', {one: params[:one], two: params[:two]}) %>

wrapping the hash in the actual path method for the page fixed the issue

<%= link_to('click me', actual_path({one: params[:one], two: params[:two]})) %>

If anyone scrolls this far...

Including Rails.application.routes.url_helpers inside a class will prevent your tests from failing.

So change

include Rails.application.routes.url_helpers

class SomeClass
  # methods
end

into

class SomeClass
  include Rails.application.routes.url_helpers

  # methods
end
Related