Troubles with route_for

Hey guys. I’m having some trouble with a route spec. In routes.rb , I
have:
map.connect ‘foods/search/:name’, :controller => :foods, :action =>
:search

foods_controller_spec.rb has: Plain Text code by nickh - 5 lines - codepad
Unfortunately, that fails: Plain Text code by nickh - 12 lines - codepad

After reading the rspec-rails 1.2.0 upgrade notes (http://tr.im/K1zx), I
haven’t been able to figure out what I’m doing wrong. Any hints?

Thanks!
Nick

PS: I’m using 1.2.9 and Rails 2.3.4 .

Nick H. wrote:

Hey guys. I’m having some trouble with a route spec. In routes.rb , I
have:
map.connect ‘foods/search/:name’, :controller => :foods, :action =>
:search

foods_controller_spec.rb has: http://codepad.org/dg3FERKw
Unfortunately, that fails: Plain Text code by nickh - 12 lines - codepad

After reading the rspec-rails 1.2.0 upgrade notes (http://tr.im/K1zx), I
haven’t been able to figure out what I’m doing wrong. Any hints?

Thanks!
Nick

PS: I’m using 1.2.9 and Rails 2.3.4 .
Hi Nick,
You need to add quotes while writing in routs.rb file.
So your route will be define as :
map.connect ‘foods/search/:name’, :controller => ‘foods’, :action =>
‘search’
Now try running the code again.You will see it pass.

Amit K. wrote:

Nick H. wrote:

Hey guys. I’m having some trouble with a route spec. In routes.rb , I
have:
map.connect ‘foods/search/:name’, :controller => :foods, :action =>
:search

foods_controller_spec.rb has: Plain Text code by nickh - 5 lines - codepad
Unfortunately, that fails: Plain Text code by nickh - 12 lines - codepad

After reading the rspec-rails 1.2.0 upgrade notes (http://tr.im/K1zx), I
haven’t been able to figure out what I’m doing wrong. Any hints?

Thanks!
Nick

PS: I’m using 1.2.9 and Rails 2.3.4 .

Hi Nick,
You need to add quotes while writing in routs.rb file.
So your route will be define as :
map.connect ‘foods/search/:name’, :controller => ‘foods’, :action =>
‘search’
Now try running the code again.You will see it pass.

Thanks for the suggestion, Amit. I changed the symbols to strings.
Unfortunately, the same error is still occurring:
http://codepad.org/lck4r1S0

David C. wrote:

I’d recommend using the route_to matcher that was added in 1.2.9
instead.

Plain Text code - 7 lines - codepad
http://rspec.rubyforge.org/rspec-rails/1.2.9/classes/Spec/Rails/Matchers.html#M000029

It’s more reliable, and aligns better with the rspec matchers API.

Cheers,
David

Thanks for that, David. I updated my spec (Plain Text code by nickh - 4 lines - codepad).
For some reason though, it’s still failing: Plain Text code by nickh - 13 lines - codepad

Just in case, this is what I have in routes.rb:
http://codepad.org/rJfIhbM6

There must be some tiny detail that I’m missing here…

On 1/11/10 9:22 PM, Nick H. wrote:

Cheers,
David

Thanks for that, David. I updated my spec (Plain Text code by nickh - 4 lines - codepad).
For some reason though, it’s still failing: Plain Text code by nickh - 13 lines - codepad

Just in case, this is what I have in routes.rb:
Plain Text code by nickh - 4 lines - codepad

There must be some tiny detail that I’m missing here…

Yes, there must. I think you’ve tried to twice define the route, and
the test shows you which one actually is being used. I’ll suggest
commenting out one of those routes at a time, and see whether the new
test results are illuminating.

Randy

On Sun, Jan 10, 2010 at 10:58 PM, Nick H. [email protected]
wrote:

I’d recommend using the route_to matcher that was added in 1.2.9
instead.

http://codepad.org/fLcxyA9N
http://rspec.rubyforge.org/rspec-rails/1.2.9/classes/Spec/Rails/Matchers.html#M000029

It’s more reliable, and aligns better with the rspec matchers API.

Cheers,
David

By the way, does this spec:
{:get => ‘/path’}.should route_to(…)
make this spec redundant?:
params_from(:get, ‘/path’).should == {…}

They read the same, but it feels like they each check one end of the
route’s translation.

On Tue, Jan 12, 2010 at 11:35 AM, Nick H. [email protected]
wrote:

By the way, does this spec:
{:get => ‘/path’}.should route_to(…)
make this spec redundant?:
params_from(:get, ‘/path’).should == {…}

Yes - route_to checks both sides of the translation.

Randy H. wrote:

On 1/11/10 9:22 PM, Nick H. wrote:

Cheers,
David

Thanks for that, David. I updated my spec (Plain Text code by nickh - 4 lines - codepad).
For some reason though, it’s still failing: Plain Text code by nickh - 13 lines - codepad

Just in case, this is what I have in routes.rb:
Plain Text code by nickh - 4 lines - codepad

There must be some tiny detail that I’m missing here…

Yes, there must. I think you’ve tried to twice define the route, and
the test shows you which one actually is being used. I’ll suggest
commenting out one of those routes at a time, and see whether the new
test results are illuminating.

Randy

I swapped the order of the 2 lines in routes.rb to this:

map.connect   'foods/search/:name', :controller => 'foods', :action 

=> ‘search’
map.resources :foods, :collection => {:search => :get}

and the spec passes now.

Thanks, guys!

David C. wrote:

On Tue, Jan 12, 2010 at 11:35 AM, Nick H. [email protected]
wrote:

By the way, does this spec:
{:get => ‘/path’}.should route_to(…)
make this spec redundant?:
params_from(:get, ‘/path’).should == {…}

Yes - route_to checks both sides of the translation.

Great, thanks for that, David! And thanks again for all of your sweat
and blood with RSpec and RSpec-Rails!

On Wed, Jan 13, 2010 at 10:20 AM, Nick H. [email protected]
wrote:

Yes - route_to checks both sides of the translation.

Great, thanks for that, David!

Thank Randy H. for this one. It was he who recognized and solved
the
problems with params_from by adding the route_to matcher.

And thanks again for all of your sweat
and blood with RSpec and RSpec-Rails!

It’s a labor of love, but you’re welcome :slight_smile:

David C. wrote:

On Wed, Jan 13, 2010 at 10:20 AM, Nick H. [email protected]
wrote:

Yes - route_to checks both sides of the translation.

Great, thanks for that, David!

Thank Randy H. for this one. It was he who recognized and solved
the
problems with params_from by adding the route_to matcher.

Whoops, you’re right. Thanks, Randy!

I guess the distinction is that you generate food_path()'s based on
existing food names, and search comes from users - but you don’t have a
distinct landing page for each food, hence no need for resource-based
routing for foods.

You could define a :show action in your controller, which simply calls
the ‘search’ action.

def show
search
end

Then they’ll have different controller-actions and different paths, yet
the implementations would be identical. And the specs can describe them
distinctly.

I’d be curious if there are other ways to do this.

Randy

Hey guys. I have two different paths that lead to the same controller
and action:
map.connect ‘foods/search/:name’, :controller => ‘foods’, :action =>
‘search’
map.food ‘:name’, :controller => ‘foods’, :action =>
‘search’

Unfortunately, the spec for the second route fails because #route_to
finds and uses the first route when generating the path for
:controller => ‘foods’, :action => ‘search’, :name => ‘almonds’

routes.rb: Ruby code by nickh - 14 lines - codepad
specs: Plain Text code by nickh - 26 lines - codepad

Is there a solution to this problem?

Thanks,
Nick