Reputation: 23
I have a Problem with Nested Resources.
2 Models
User => has_many :stuffs
Stuff => belongs_to :user
routes.rb
map.resources :stuffs
map.resources :users, :has_many => [:stuffs]
When i call /users/1/stuffs it presents me the Stuff for the corresponding User. but i got this also when i call /users/2/stuffs. It should return 0 "Stuffs" but it dont work.
MySQL Query from Server
SELECT * FROM `stuffs`
rake routes
stuffs GET /stuffs(.:format) {:action=>"index", :controller=>"stuffs"}
POST /stuffs(.:format) {:action=>"create", :controller=>"stuffs"}
new_stuff GET /stuffs/new(.:format) {:action=>"new", :controller=>"stuffs"}
edit_stuff GET /stuffs/:id/edit(.:format) {:action=>"edit", :controller=>"stuffs"}
stuff GET /stuffs/:id(.:format) {:action=>"show", :controller=>"stuffs"}
PUT /stuffs/:id(.:format) {:action=>"update", :controller=>"stuffs"}
DELETE /stuffs/:id(.:format) {:action=>"destroy", :controller=>"stuffs"}
user_stuffs GET /users/:user_id/stuffs(.:format) {:action=>"index", :controller=>"stuffs"}
POST /users/:user_id/stuffs(.:format) {:action=>"create", :controller=>"stuffs"}
new_user_stuff GET /users/:user_id/stuffs/new(.:format) {:action=>"new", :controller=>"stuffs"}
edit_user_stuff GET /users/:user_id/stuffs/:id/edit(.:format) {:action=>"edit", :controller=>"stuffs"}
user_stuff GET /users/:user_id/stuffs/:id(.:format) {:action=>"show", :controller=>"stuffs"}
PUT /users/:user_id/stuffs/:id(.:format) {:action=>"update", :controller=>"stuffs"}
DELETE /users/:user_id/stuffs/:id(.:format) {:action=>"destroy", :controller=>"stuffs"}
users GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
root / {:action=>"index", :controller=>"users"}
gem list
actionmailer (2.3.8)
actionpack (2.3.8)
activerecord (2.3.8)
activeresource (2.3.8)
activesupport (2.3.8)
arel (2.0.6)
authlogic (2.1.6)
builder (2.1.2)
cgi_multipart_eof_fix (2.5.0)
gem_plugin (0.2.3)
i18n (0.5.0)
mongrel (1.1.5 x86-mingw32)
mysql (2.8.1 x86-mingw32)
paperclip (2.3.7)
rack (1.1.0)
rails (2.3.8)
rake (0.8.7)
tzinfo (0.3.23)
There is no where clause for the corresponding user_id. But how to fix it?
Rails Version 2.3.8
Hope somebody can help
Upvotes: 1
Views: 881
Reputation: 3304
Rails controllers will not filter your results by default. As above, since you're probably calling Stuff.all in your StuffsController, it will always return all Stuff objects.
I use inherited_resources for the default behaviour on my sites. It handles these relationships automatically and lets you override it when you want different behaviour:
https://github.com/josevalim/inherited_resources
Upvotes: 3
Reputation: 474
Try this
map.resources :users do |users|
users.resources :stuffs
end
Upvotes: 0
Reputation: 26979
Routes alone don't affect the model. Since the user id is passed in, though, you can do:
User.find(params[:user_id]).stuffs
Upvotes: 0
Reputation: 226
In your Stuffs controller's index method, how are you collecting your stuffs? If you used a scaffold to create the controller it will default to something like
@stuffs = Stuff.all
but should be something along the lines of
@user = User.find(params[:user_id])
@stuffs = @user.stuffs
or something to that effect--basically, you're collecting the user's stuff, not all stuff.
Upvotes: 5