Couldn't find User without an ID

Hello! I'm trying to create a list of user "ads" on my home page in my app. But I don't get it to work. I'm a rails noob so it might be something trivial. I'm currently running into this error:

  Couldn't find User without an ID

My pages controller where to home action is looks like this:

def home     @title = "Startsidan"     @user = User.find(params[:id])     @ads = @user.Ad.paginate(:page => params[:page]) end

And my ad partial looks like this:

<div class="ad body_copy">   <%= image_tag user.avatar.url(:thumb) %>   <span class="content">     <%= link_to user.name, user %>     <%= user.ads.content %>   </span> </div>

Any help would be appreciated! I hope that my explanation is clear enough.

Best regards Anders

Hello! I'm trying to create a list of user "ads" on my home page in my app. But I don't get it to work. I'm a rails noob so it might be something trivial. I'm currently running into this error:

Couldn't find User without an ID

There should be a lot more information available with the error, including where it has failed. The clue may be in the error message though, it is trying to find a user and there is no id.

My pages controller where to home action is looks like this:

def home @title = "Startsidan" @user = User.find(params[:id])

Possibly this is the problem line, if so then perhaps params[:id] is nil (hence the error message). Have a look in the log (log/development.log) and it will tell you what the params are. Are you passing the id to the home action? Also you could have a look at the rails guide on debugging to see how to break into your application using ruby-debug and examine the data at that point.

Colin

Hello Colin!

Thanks for your reply. You are right about where the error is occurring, this line is causing the error, @user = User.find(params[:id]).

I haven't passed the id to the home action, where should i do that and how? Sorry for the noobish question but your help would be gold!

Could you not top post please, it is easier to follow the thread if comments are inserted into the previous post. Thanks

Hello Colin!

Thanks for your reply. You are right about where the error is occurring, this line is causing the error, @user = User.find(params[:id]).

I haven't passed the id to the home action, where should i do that and how? Sorry for the noobish question but your help would be gold!

That depends what you are trying to do. If you explain that we may be able to help. If you do not know what the params hash is all about then you need to work through some basic tutorials. See the rails guides at http://guides.rubyonrails.org/ if you are using Rails 3 or Ruby on Rails guides if using version 2.3.x. Start with Getting Started obviously, then work through the others.

Colin

home action seems to be a member restful action and it needs an id to find the record but you are not declaring that route the right way show the routes please

Thanks for your tips Colin!

Hi radhames!

Thanks for your help on my previous topic.

Here is my routes.rb file:

  resources :users   resources :sessions, :only => [:new, :create, :destroy]   resources :ads, :only => [:new, :create, :destroy]

  match '/registrera', :to => 'users#new'

  match '/inloggning', :to => 'sessions#new'   match '/utloggning', :to => 'sessions#destroy'

  root :to => 'pages#home'   match '/kontakt', :to => 'pages#contact'   match '/om', :to => 'pages#about'

Thanks!

// Anders

ok there is a problem

@user = User.find(params[:id]) <================= params[:id] is pulled from the url query string

in rails the convention is this

/controller/action/id

in cases there you need to pull one specific record

/controller/action

to pull a collection

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

here you are pulling an specific user but

root :to => ‘pages#home’

there is no id at the end of your so params[:id] has nothing in it

thats why Couldn’t find User without an ID

Hi radhames!

So the problem lies in my routes!?!, do you have any suggestion on how it should look?

Thanks!

// Anders

it the route you set a requirement but you could access the client with a query, something like this

link_to “Home”, root_path(:id=>@user.id)

but what this does is add this to the url string

?id=1

and is not what you want since people can still access the original with out ?id=1 gicing user the same message so what you do is create a route like this

match ‘products/:id’ => ‘catalog#view’ <============copied from the routes.rb comments

you see here the id is specified that means that it the user access product with no id the message will be

no routes matched /products

and that is what we want, not an error in the controller is just that there is no page in the site you can access without specifing the id.

conclusion is not a good idea to have a root route that requieres an id instead

match ‘pages/:id’ => ‘pages#home’

and

root :to => “welcome#index”

Thanks radhames!

I finally got it to work, it turned out that i didn't need to define @user in my home action, and it was causing the error. Sorry if my description was unclear. Thanks for your help!

// Anders

You might take a look at your routes for future reference. Specifically, take a look at RESTful routing where rails does most of the work for you. The home path you setup could easily be the index path for your base controller.