Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using the correct url_for method in a Rails engine spec

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?

like image 224
Samo Avatar asked Dec 18 '13 14:12

Samo


3 Answers

I had the same issue when updating to Rails 4, and I discovered that the problem was a model containing the following line:

include Rails.application.routes.url_helpers

Try finding code in your application that includes url_helpers somewhere. Removing that line should help solve the problem.

like image 81
Koichiro Wada Avatar answered Nov 08 '22 08:11

Koichiro Wada


It looks to me like the problem is that include ActionView::Helpers and include Rails.application.routes.url_helpers conflict with each other.

I've found that if you put ActionView::Helpers first it doesn't raise the error. So change

include Rails.application.routes.url_helpers     
include ActionView::Helpers

to

include ActionView::Helpers
include Rails.application.routes.url_helpers
like image 33
montrealmike Avatar answered Nov 08 '22 07:11

montrealmike


include ActionView::Helpers::UrlHelper -> In my case, this was the line that i had to search and comment.

like image 38
Alex Avatar answered Nov 08 '22 08:11

Alex