Nested Resource w/ Collection

Hi guys,

In my routes file I have the following nested resource:

resources :users do
collection do
get ‘posts’
end
end

However, when I visit this URL: http://localhost:3000/users/posts, I get
this error: “The action ‘posts’ could not be found for UsersController”

In my UsersController I have the following:

class UsersController < ApplicationController

GET /users

GET /users.json

def index
@users = User.order(:name)

respond_to do |format|
  format.html # index.html.erb
  format.json  { render :json => @users }
end

end

GET /users/1

GET /users/1.json

def show
@user = User.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.json  { render :json => @user }
end

end

GET /users/new

GET /users/new.json

def new
@user = User.new

respond_to do |format|
  format.html # new.html.erb
  format.json  { render :json => @user }
end

end

GET /users/1/edit

def edit
@user = User.find(params[:id])
end

POST /users

POST /users.json

def create
@user = User.new(params[:user])

respond_to do |format|
  if @user.save
    format.html { redirect_to(users_url,
      :notice => "User #{@user.name} was successfully created.") }
    format.json  { render :json => @user,
      :status => :created, :location => @user }
  else
    format.html { render :action => "new" }
    format.json  { render :json => @user.errors,
      :status => :unprocessable_entity }
  end
end

end

PUT /users/1

PUT /users/1.json

def update
@user = User.find(params[:id])

respond_to do |format|
  if @user.update_attributes(params[:user])
    format.html { redirect_to(users_url,
      :notice => "User #{@user.name} was successfully updated.") }
    format.json  { head :ok }
  else
    format.html { render :action => "edit" }
    format.json  { render :json => @user.errors,
      :status => :unprocessable_entity }
  end
end

end

DELETE /users/1

DELETE /users/1.json

def destroy
@user = User.find(params[:id])
@user.destroy

respond_to do |format|
  format.html { redirect_to(users_url) }
  format.json  { head :ok }
end

end
end

What would I change for the route: http://localhost:3000/users/posts to
work?

Kind Regards,
Chad E.
The Code Boutique

“The action ‘posts’ could not be found for UsersController”

http://localhost:3000/users/posts

routes your request to UsersController#posts, but method ‘posts’ is not
there.

Add ‘posts’ method to UsersController, and your problem is solved.


On 17 May 2011 09:27, Eugen C. [email protected] wrote:

“The action ‘posts’ could not be found for UsersController”

http://localhost:3000/users/posts

Add ‘posts’ method to UsersController, and your problem is solved.

Or… you have just created a whole load of different problems… :-/

Instead, check the result of “rake routes” to see what routes Rails is
expecting - this might put you on the track towards what is not right
with your routing.

On 17 May 2011 06:26, Chad E. [email protected] wrote:

In my routes file I have the following nested resource:

resources :users do
collection do
get ‘posts’
end
end

PS Just to clarify, rather than “collection” you possibly want to use
the syntax:
resources :users do
resources :posts
end

On 17 May 2011 15:30, Chad E. (gMail) [email protected]
wrote:

Ultimately I am trying to keep a relationship between the two models but remove
the user id from the URL.

You can keep a relationship between models without any nesting of
routes. Whether a Post belongs to a User, or has many Comments has no
requirement for certain routes. The routes are just there to help
you get about those relationships.
What exact functionality do you want to implement?

The end goal is this: I have a client app that is proxing json from the
rails server. Our current way of using /users/id/posts.json as the url
proxied does not work as needed. I would like to set a relation between
the user and post model but NOT have a nested url. The desired scenario
is this: A user logs in and creates a session. After authentication a
redirect to /posts occurs. Post belongs to user and user has_many
posts.

If you’d like and have a git account, I can add you as a contributor to
this demo. This way you can see and change the logic I have currently.
Here is a link to the git project:

Kind Regards,
Chad E.
The Code Boutique

Michael,

I initially I was using resources as oppose to collection. I ran take
routes and users/posts is a valid route.

Ultimately I am trying to keep a relationship between the two models but
remove the user id from the URL.

Kind Regards,
Chad E.
The Code Boutique

Sent from my iPhone