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 Eubanks 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.

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.

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

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 Eubanks The Code Boutique

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: https://github.com/TheCodeBoutique/Blogger

Kind Regards, Chad Eubanks The Code Boutique