The right way to organize controllers with nested resources (rails)
I'm hoping this question isn't too subjective, but here goes.
For simplicity sake, I've got a User model with many nested resources. For instance, a @user has many @books, @cars, @friends.
In the user's "show" view, I present the user with a dashboard, that shows widgets for all of their things (books, cars, and friends).
My issue now is that the UsersController has to do any/all logic pertaining to books, cars, and friend开发者_JS百科s. And putting logic for Books, etc in the UsersController just feels wrong.
In rails you can use nested resources in your routes like so
resources :users do
resources :books
end
That would give you something like
/users/id_of_user/books
Which would hit the index of your books controller, simply check for user_id availability inside your books controller and fetch all books attached to the current user if its there.
Using your controllers and routing this way you can easily spread your logic around to better suited controllers and keep it out of your users controller.
Check out the docs below for more information like snazy helpers for your new nested paths. http://guides.rubyonrails.org/routing.html#nested-resources
Shortly after commenting I found the :before_filter on the Rails guide. Using this, you can call actions based on whether the nested resource is found, and the related template. This is what I did, and works well for me!
before_filter :user_resource
def user_resource
return unless params[:user_id]
redirect_to root_url and return unless params[:user_id] == current_user.id.to_s
action = :"user_#{params[:action]}"
if self.methods.include? action
self.send action
render action
end
end
and an example of a method it calls
def user_index
ads = Classified.where(:owner_id => params[:user_id])
@classifieds = ads
end
精彩评论