2
votes

I've got Rails routing problem. I would like to use singular resource with user controller but it doesn't work as I expected. Here is the fragment of my routes.rb file:

scope :module => "frontend" do
  root :to => "home#index"
  resource :user, :controller => "user"
  get "/sign_up" => "user#new"
  get "/sign_in" => "user#sign_in"
  get "/sign_out" => "user#sign_out"
  post "/authenticate" => "user#authenticate"
  resources :articles
  resources :article_categories
end

I thought it will work when I'll use for example "/user" or "/user/new" URL but it didn't. I get a routing error:

No route matches {:controller=>"frontend/user"}

The 'rake routes' command output is:

     user POST   /user(.:format)          frontend/user#create
 new_user GET    /user/new(.:format)      frontend/user#new
edit_user GET    /user/edit(.:format)     frontend/user#edit
          GET    /user(.:format)          frontend/user#show
          PUT    /user(.:format)          frontend/user#update
          DELETE /user(.:format)          frontend/user#destroy
  sign_up GET    /sign_up(.:format)       frontend/user#new
  sign_in GET    /sign_in(.:format)       frontend/user#sign_in
 sign_out GET    /sign_out(.:format)      frontend/user#sign_out

authenticate POST /authenticate(.:format) frontend/user#authenticate

What is interesting, when I add route for index action in user controller, like this:

scope :module => "frontend" do
  root :to => "home#index"
  resource :user, :controller => "user"
  get "/user" => "user#index"
  get "/sign_up" => "user#new"
  get "/sign_in" => "user#sign_in"
  get "/sign_out" => "user#sign_out"
  post "/authenticate" => "user#authenticate"
  resources :articles
  resources :article_categories
end

...it works!

But index action is not defined in user controller! 'rake routes' command returns double line for GET /user

          GET    /user(.:format)          frontend/user#show
          GET    /user(.:format)          frontend/user#index

so I suppose that's not the solution. Other actions assigned to '/users' URL don't work.

Is it necessary to define the route for the index action like

get "/controller_name" => "controller_name#index"

What am I doing wrong?

2

2 Answers

5
votes

Defining a singular resource in your routes will not generate a route to an index action by design. The singular resource implies you're always going to lookup this resource without specifying an ID and consequently a get to index for a singular resource just doesn't make logical sense. So, a GET to your url "/user" will route to a show action for that singular resource and not an index.

EDIT: Since your issue isn't obvious, I'd simplify your routes until you can at least hit the controller you'd expect and then build from there.

config/routes.rb

 scope :module=>"frontend" do
   resource :user
 end
 #ensure you don't have any other user routes listed before this that would match "/user". 

app/controllers/frontend/users_controller.rb

 module Frontend
   class UsersController < ApplicationController
     def show
       raise "in frontend/show"
     end
   end
 end
0
votes

Thanks a lot for help! I found the bug.

The routing error was caused by the following line of the layout html file

<%= auto_discovery_link_tag(:rss, {:action => "index"}, {:title => "RSS"}) %>

I was looking for errors in the erb view files but I forgot about the layout. I must remember to check the entire view layer in such situations.