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(开发者_如何学Python.: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
Should work like this => http://guides.rubyonrails.org/routing.html 2.7 Nested Resources
Hope somebody can help
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.
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
Routes alone don't affect the model. Since the user id is passed in, though, you can do:
User.find(params[:user_id]).stuffs
Try this
map.resources :users do |users|
users.resources :stuffs
end
精彩评论