0
votes

I'm getting a weird error when I try to link to the show_members action

Routing Error
No route matches "/groups/1/show_members"

#routes.rb
get 'groups/:id/members' => 'groups#show_members'

#groups_controller.rb
def show_members

When I run rake routes I get this:

#rake routes
            groups GET    /groups(.:format)           {:controller=>"groups", :action=>"index"}
            groups POST   /groups(.:format)           {:controller=>"groups", :action=>"create"}
         new_group GET    /groups/new(.:format)       {:controller=>"groups", :action=>"new"}
        edit_group GET    /groups/:id/edit(.:format)  {:controller=>"groups", :action=>"edit"}
             group GET    /groups/:id(.:format)       {:controller=>"groups", :action=>"show"}
             group PUT    /groups/:id(.:format)       {:controller=>"groups", :action=>"update"}
             group DELETE /groups/:id(.:format)       {:controller=>"groups", :action=>"destroy"}
        group_join GET    /groups/join(.:format)       {:controller=>"groups", :action=>"join"}
 group_remove_user PUT    /groups/remove_user(.:format){:controller=>"groups", :action=>"remove_user"}
                   GET    /groups/:id/members(.:format){:controller=>"groups", :action=>"show_members"}

UPDATE: But all I want the show_members action to do is show all the users within that group. I want the user functionality and paths to remain the same. And now the show_members action routes to group, the same as show. In my groups controller, I split the default show group action into three pages, one for the group profile which is show, one for the members in that group which goes to show_members, and one for the news page, which will go to show_news when i get to it.

#groups_controller.rb
def show_members
  @group = Group.find(params[:id])
  @members = @group.users
  @group_admin = User.find(@group.group_admin)
  respond_to do |format|
    format.html # show.html.erb
    format.xml  { render :xml => @group }
  end
end

#rake routes
group_join GET    /groups/:group_id/join(.:format) {:controller=>"groups", :action=>"join"}
group_remove_user PUT    /groups/:group_id/remove_user(.:format) {:controller=>"groups", :action=>"remove_user"}
group GET    /groups/:group_id/:id/members(.:format) {:controller=>"groups", :action=>"show_members"}
group_users GET    /groups/:group_id/users(.:format) {:controller=>"users", :action=>"index"}
group_user GET    /groups/:group_id/users/:id(.:format) {:controller=>"users", :action=>"show"}
I WANT THIS new_user_session GET    /users/sign_in(.:format) {:controller=>"devise/sessions", :action=>"new"}
INSTEAD OF THIS new_user_group_session GET    /users/groups/:group_id/sign_in(.:format)          {:controller=>"devise/sessions", :action=>"new"}
user_group_session POST   /users/groups/:group_id/sign_in(.:format)          {:controller=>"devise/sessions", :action=>"create"}
destroy_user_group_session GET    /users/groups/:group_id/sign_out(.:format)         {:controller=>"devise/sessions", :action=>"destroy"}
user_group_password POST   /users/groups/:group_id/password(.:format)         {:controller=>"devise/passwords", :action=>"create"}
new_user_group_password GET    /users/groups/:group_id/password/new(.:format)     {:controller=>"devise/passwords", :action=>"new"}
edit_user_group_password GET    /users/groups/:group_id/password/edit(.:format)    {:controller=>"devise/passwords", :action=>"edit"}
user_group_password PUT    /users/groups/:group_id/password(.:format)         {:controller=>"devise/passwords", :action=>"update"}
user_group_registration POST   /users/groups/:group_id(.:format)                  {:controller=>"users/registrations", :action=>"create"}

new_user_group_registration GET /users/groups/:group_id/sign_up(.:format) {:controller=>"users/registrations", :action=>"new"} edit_user_group_registration GET /users/groups/:group_id/edit(.:format) {:controller=>"users/registrations", :action=>"edit"} user_group_registration PUT /users/groups/:group_id(.:format) {:controller=>"users/registrations", :action=>"update"} user_group_registration DELETE /users/groups/:group_id(.:format) {:controller=>"users/registrations", :action=>"destroy"} user_group_confirmation POST /users/groups/:group_id/confirmation(.:format) {:controller=>"devise/confirmations", :action=>"create"} new_user_group_confirmation GET /users/groups/:group_id/confirmation/new(.:format) {:controller=>"devise/confirmations", :action=>"new"} user_group_confirmation GET /users/groups/:group_id/confirmation(.:format) {:controller=>"devise/confirmations", :action=>"show"} groups GET /groups(.:format) {:controller=>"groups", :action=>"index"} groups POST /groups(.:format) {:controller=>"groups", :action=>"create"} new_group GET /groups/new(.:format) {:controller=>"groups", :action=>"new"} edit_group GET /groups/:id/edit(.:format) {:controller=>"groups", :action=>"edit"} group GET /groups/:id(.:format) {:controller=>"groups", :action=>"show"} group PUT /groups/:id(.:format) {:controller=>"groups", :action=>"update"} group DELETE /groups/:id(.:format) {:controller=>"groups", :action=>"destroy"}

#routes.rb
resources :groups do
  get 'join' => 'groups#join'
  put 'remove_user' => 'groups#remove_user'
  get ':id/members' => 'groups#show_members'
  resources :users, :only => [:index, :show]
  devise_for :users, :controllers => { :registrations => "users/registrations" }
end
2
Nick's answer is correct in it fixes your problem but you're adopting bad practice and you should have distinct models, views and controllers for groups and for users. Watch this railscast railscasts.com/episodes/139. Though the routing syntax has changed between rails 2 and rails 3 which you're using, everything else is the same.mark

2 Answers

2
votes

Rails is correct when it says that no route matches /groups/1/show_members - your routes.rb is creating a route for something like /groups/1/members (without the "show_")

You'll need to change routes.rb to look like:

get 'groups/:id/show_members` => 'groups#show_members'
0
votes

Well the problem is of course you haven't done everything right.

resources :groups do |group|
  group.resources :members
end

link_to @member.name, [@group, @member]

Magic.

Now reading the guide would be a very good idea.

http://guides.rubyonrails.org/routing.html