Please help with a routing problem


#1

Hi All

I’m having some issues with the following routes problem.

The routes.rb file …
map.resources :users
map.connect ‘/users/view_payments/:user_id’, :controller =>
‘users’, :action => ‘view_payments’

The users_controller.rb file …
def view_payments
@user = User.find[:params[:user_id]]
@payments = @user.payments
end

The routes list from a rake routes …
/users/view_payments/:user_id
{:controller=>“users”, :action=>“view_payments”}

The …/views/users/view_payments.html.erb file …
<%= link_to ‘View Payments’, :controller => ‘users’, :action =>
‘view_payments’, :user_id => @user.id %>

Then the URL generated from the link_to …
http://localhost:3000/users/view_payments/2

But this returns a 404 error

Any help/ideas appreciated

Cheers
Adrian


#2

On Mon, Jan 26, 2009 at 1:08 PM, Adrian removed_email_address@domain.invalid
wrote:

The users_controller.rb file …
<%= link_to ‘View Payments’, :controller => ‘users’, :action =>
Adrian

Firstly have you restarted the server, this has bitten me more than a
few
times.
Otherwise try putting the more specific route first in the routes file.


Andrew T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

“I have never let my schooling interfere with my education” - Mark Twain


#3

You need to define a member resource on the map.resources :users. For
more information see the guide on routing on
http://guides.rubyonrails.org


#4

try
map.resources :users, :member => {:view_payments => :get}

should work.


#5

On Jan 26, 5:08 am, Adrian removed_email_address@domain.invalid wrote:

def view_payments
‘view_payments’, :user_id => @user.id %>

Then the URL generated from the link_to …
http://localhost:3000/users/view_payments/2

But this returns a 404 error

Any help/ideas appreciated

Cheers
Adrian

As others have said, you just need to define the custom action in your
routes.

But I might suggest a more restful approach:

map.resources :users, :has_many => :payments

Then you can use links like

http://localhost:3000/users/2/payments

This calls the index action of a Payments controller. You can look at
params[:user_id] to know which user is involved. This way you don’t
need any custom actions.

Just a thought.

Jeff
switchingtorails.com


#6

Thanks to all who responded.

I decided to go with the more RESTful approach:

map.resources :users, :has_many => :payments

and use the index action on the payments controller.

Cheers
Adrian