How can I maintain DRY code on polymorphic controllers and views? For
example, I am building an app where users have many posts and at the
same time a group can have many posts and a category can be related to
many posts (post belongs to a user, category and a group).
groups/1/posts
users/1/posts
category/1/posts
So what happens then to the posts_controller? How can I know for
example if I want to show the posts for a group, the posts of a
specific user or category?
Someone could tell me to do something like this:
def index
if params[:group_id]
@posts = Post.find(:all, :conditions => ["group_id = ?,
params[:group_id])
elsif params[:user_id]
@posts = Post.find(:all, :conditions => ["user_id = ?,
params[:user_id])
elsif params[:category_id]
@posts = Post.find(:all, :conditions => ["category_id = ?,
params[:category_id])
end
end
But then again this code will be unsustainable in the future when more
routes are added (ifs block will be hell). And when I take into
account that the views and links should render differently for each
case makes it worst.
What''s the best solution for this? Any suggestions or guidelines are
appreciated.
Thanks,
Elioncho
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Anyone? I am truly lost on which approach to take On Sep 22, 1:47 am, elioncho <elion...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> How can I maintain DRY code on polymorphic controllers and views? For > example, I am building an app where users have many posts and at the > same time a group can have many posts and a category can be related to > many posts (post belongs to a user, category and a group). > > groups/1/posts > users/1/posts > category/1/posts > > So what happens then to the posts_controller? How can I know for > example if I want to show the posts for a group, the posts of a > specific user or category? > > Someone could tell me to do something like this: > > def index > if params[:group_id] > @posts = Post.find(:all, :conditions => ["group_id = ?, > params[:group_id]) > elsif params[:user_id] > @posts = Post.find(:all, :conditions => ["user_id = ?, > params[:user_id]) > elsif params[:category_id] > @posts = Post.find(:all, :conditions => ["category_id = ?, > params[:category_id]) > end > end > > But then again this code will be unsustainable in the future when more > routes are added (ifs block will be hell). And when I take into > account that the views and links should render differently for each > case makes it worst. > > What''s the best solution for this? Any suggestions or guidelines are > appreciated. > > Thanks, > > Elioncho--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Sep 22, 10:52 pm, elioncho <elion...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Anyone? I am truly lost on which approach to takeTry this one: def index args = {} [:user_id, :group_id, :category_id].each do |k| args[k] = params[k] end @posts = Post.find(:all, :conditions => args) end This way you also get: /users/1/categories/1/posts /groups/1/categories/1/posts ... --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Elias Orozco wrote:> Anyone? I am truly lost on which approach to takeThis post may be able to help you; http://revolutiononrails.blogspot.com/2007/05/drying-up-polymorphic-controllers.html -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Well, I think I didn´t write my question correctly, I''ll try to be more explicit. In the app I am working on, users can create posts like in a blog. The app emphasizes on the fact of belonging to a group. So a post belongs to a group and a user (table posts has a user_id and group_id column). I want to show the list of posts that belong to certain group. I use the index action from the posts_controller to show all the posts that belong to a certain group through the route groups/1/posts. Also, I show other things such as: most recommended posts and more active users, all in the same index action and view. It''s here where the problem starts. I want to also show the index of the posts made by a specific user (the route should be users/1/posts) and additional info too. I thought about using chains of ifs and elses (asking for params in the route to know which data to show) in the index action and views as an "easy, dirty and unmaintainable solution". But there are more problems. There should be a option to filter the posts of a group by category and tags (and this too applies to posts for a specific user). This is where the problems becomes a snow ball. The fact that there should always be filtering for a specific group or user. And that''s without taking into account the views which will show different information depending on the context (user or group). I thought about having various controllers but it seems illogical: post_users, post_groups, post_user_categories, post_group_categories, post_user_tags, post_group_tags... So that''s it. I don''t know which is the right move. Any help or suggestion is appreciated. Thanks, Elías --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Well, I think I didn´t write my question correctly, I''ll try to be more explicit. In the app I am working on, users can create posts like in a blog. The app emphasizes on the fact of belonging to a group. So a post belongs to a group and a user (table posts has a user_id and group_id column). I want to show the list of posts that belong to certain group. I use the index action from the posts_controller to show all the posts that belong to a certain group through the route groups/1/posts. Also, I show other things such as: most recommended posts and more active users, all in the same index action and view. It''s here where the problem starts. I want to also show the index of the posts made by a specific user (the route should be users/1/posts) and additional info too. I thought about using chains of ifs and elses (asking for params in the route to know which data to show) in the index action and views as an "easy, dirty and unmaintainable solution". But there are more problems. There should be a option to filter the posts of a group by category and tags (and this too applies to posts for a specific user). This is where the problems becomes a snow ball. The fact that there should always be filtering for a specific group or user. And that''s without taking into account the views which will show different information depending on the context (user or group). I thought about having various controllers but it seems illogical: post_users, post_groups, post_user_categories, post_group_categories, post_user_tags, post_group_tags... So that''s it. I don''t know which is the right move. Any help or suggestion is appreciated. Thanks, Elías --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Sep 23, 2:35 pm, elioncho <elion...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Well, I think I didn´t write my question correctly, I''ll try to be > more explicit. > > In the app I am working on, users can create posts like in a blog. The > app emphasizes on the fact of belonging to a group. So a post belongs > to a group and a user (table posts has a user_id and group_id column). > I want to show the list of posts that belong to certain group. I use > the index action from the posts_controller to show all the posts that > belong to a certain group through the route groups/1/posts. Also, I > show other things such as: most recommended posts and more active > users, all in the same index action and view. > > It''s here where the problem starts. I want to also show the index of > the posts made by a specific user (the route should be users/1/posts) > and additional info too. I thought about using chains of ifs and elses > (asking for params in the route to know which data to show) in the > index action and views as an "easy, dirty and unmaintainable > solution". But there are more problems. There should be a option to > filter the posts of a group by category and tags (and this too applies > to posts for a specific user). This is where the problems becomes a > snow ball. The fact that there should always be filtering for a > specific group or user. And that''s without taking into account the > views which will show different information depending on the context > (user or group). I thought about having various controllers but it > seems illogical: post_users, post_groups, post_user_categories, > post_group_categories, post_user_tags, post_group_tags... > > So that''s it. I don''t know which is the right move. Any help or > suggestion is appreciated. > > Thanks, > > ElíasReposting, since I think this may be close to what you''re looking for: def index args = {} [:user_id, :group_id, :category_id, :tag_id].each do |k| args[k] = params[k] if params[k] end @posts = Post.find(:all, :conditions => args) end Which will filter for the following, assuming you''ve setup your routes correctly: /users/1/posts /groups/1/posts /categories/1/posts /tags/1/posts /users/1/categories/1/posts /users/1/tags/1/posts /groups/1/categories/1/posts /groups/1/tags/1/posts ... /groups/1/users/1/categories/1/tags/1/posts (although I doubt you''ll be having this kind of route) In short, it will accept filters for a route with a combination of users, groups, categories, and tags. HTH --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks for your support Erol. I guess I''ll have to put some extra ifs and elses because I have to show additional data on the index action and view. (not only @posts, for example for group index posts I must show a list of latest posts from the group, but also the most commented and active posts + a tag cloud. Your proposed solution is good, but I am worried about the views. Any ideas on how to maintain the views clean and dry? I am imaging myself writing tons of ifs and elses on the index view. Thanks again, Elías On Sep 23, 2:28 am, Erol Fornoles <erol.forno...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Sep 23, 2:35 pm,elioncho<elion...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > > Well, I think I didn´t write my question correctly, I''ll try to be > > more explicit. > > > In the app I am working on, users can create posts like in a blog. The > > app emphasizes on the fact of belonging to a group. So a post belongs > > to a group and a user (table posts has a user_id and group_id column). > > I want to show the list of posts that belong to certain group. I use > > the index action from the posts_controller to show all the posts that > > belong to a certain group through the route groups/1/posts. Also, I > > show other things such as: most recommended posts and more active > > users, all in the same index action and view. > > > It''s here where the problem starts. I want to also show the index of > > the posts made by a specific user (the route should be users/1/posts) > > and additional info too. I thought about using chains of ifs and elses > > (asking for params in the route to know which data to show) in the > > index action and views as an "easy, dirty and unmaintainable > > solution". But there are more problems. There should be a option to > > filter the posts of a group by category and tags (and this too applies > > to posts for a specific user). This is where the problems becomes a > > snow ball. The fact that there should always be filtering for a > > specific group or user. And that''s without taking into account the > > views which will show different information depending on the context > > (user or group). I thought about having various controllers but it > > seems illogical: post_users, post_groups, post_user_categories, > > post_group_categories, post_user_tags, post_group_tags... > > > So that''s it. I don''t know which is the right move. Any help or > > suggestion is appreciated. > > > Thanks, > > > Elías > > Reposting, since I think this may be close to what you''re looking for: > > def index > args = {} > [:user_id, :group_id, :category_id, :tag_id].each do |k| > args[k] = params[k] if params[k] > end > > @posts = Post.find(:all, :conditions => args) > end > > Which will filter for the following, assuming you''ve setup your routes > correctly: > > /users/1/posts > /groups/1/posts > /categories/1/posts > /tags/1/posts > /users/1/categories/1/posts > /users/1/tags/1/posts > /groups/1/categories/1/posts > /groups/1/tags/1/posts > ... > /groups/1/users/1/categories/1/tags/1/posts (although I doubt you''ll > be having this kind of route) > > In short, it will accept filters for a route with a combination of > users, groups, categories, and tags. > > HTH--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---