I have the following models:
- Post
- Tag
- TaggedPost (from which Post and Tag derive their associations by has_many :through)
And I have the following routes.rb
file:
resources :tags
resources :posts do
resources :tags
end
So when I navigate to, say, /posts/4/tags
, that will shoot me into the index action for the Tag controller with the post_id
value set in the parameters array. Cool.
My question is though, now that I'm accessing the nested tags resource under posts, should I be hitting the Tags controller still? Or should I setup some other controller to handle the nested nature of tags at this point? Otherwise I have to build additional logic into the Tags controller. This can be done of course, but is this the common way of handling nested routes and resources? The code I have in the index action for the Tags controller is as follows:
TagsController.rb
def index
if params[:post_id] && @post = Post.find_by_id(params[:post_id])
@tags = Post.find_by_id(params[:post_id]).tags
else
@tags = Tag.order(:name)
end
respond_to do |format|
format.html
format.json {render json: @tags.tokens(params[:q]) }
end
end
I can see the code in this controller growing increasingly large, as I plan for many additional resources to be associated with tag resources. Thoughts on how to break this out?
Summary of questions:
- If a resource is nested, should the nested resource be going through a different controller representing the nested nature of the resource? This is opposed to going through the normal controller as I am in the code example that I provided.
- If so, how should these controllers be named and setup?
Let me know if you need more information.
I think the best solution is to split up controllers:
And then you have 3 controllers. Optionally, you can inherit PostTagsController from TagsController to do something like:
If the difference is only the retrieval of tags, you can:
Use that methods and simply override tags in the inheriting controllers ;)
All you are doing with nested resources is changing the routing URL. Only thing you would have to do is make sure you are passing the proper id (in your case post)to the tag controller. Most common error is the Can't Find *** ID.
If you don't nest a profile route into a user route it would look like this
When you nest the routes it would be
That is all that it is doing and nothing else. You don't need additional controllers. Doing nested routing is just for looks. allowing your user to follow the association. The most important thing about nesting routes is that you make sure you make the link_to's to the right path.
When not nested: it would be
and
when it is nested you would need to use
rake routes
is your friend to find out how the routes have changed.Hope it helps.