Forum: Ruby on Rails Polymorphic problems

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Serafino P. (Guest)
on 2008-10-14 13:40
Hi!

I have a problem related to polymorphic associations.
Currently in my routes i define the following:

  map.resources :articles do |articles|
    articles.resources :comments
  end

  map.resources :posts do |posts|
    posts.resources :comments
  end

I have basically posts and articles models which relate to the
polymorphic model comment.
Routes are generated as I expect to, but the problem resides in the
comments_controller, since in this controller I'm not able to figure out
if I'm creating a comment for a post or for an article.

Is there a (possibly clean) way to solve this?

Thanks
Sniper A. (Guest)
on 2008-10-14 17:00
Serafino P. wrote:
> Hi!
>
> I have a problem related to polymorphic associations.
> Currently in my routes i define the following:
>
>   map.resources :articles do |articles|
>     articles.resources :comments
>   end
>
>   map.resources :posts do |posts|
>     posts.resources :comments
>   end
>
try this
 map.resources :articles ,:has_many=>:comments
 map.resources :posts    ,:has_many=>:comments
Serafino P. (Guest)
on 2008-10-14 17:18
Pokkai D. wrote:
> try this
>  map.resources :articles ,:has_many=>:comments
>  map.resources :posts    ,:has_many=>:comments

This will only shorten the code in routes, but not solve my problem.
Thanks for the tip in any case
Jeff C. (Guest)
on 2008-10-14 21:06
(Received via mailing list)
On Oct 14, 4:40 am, Serafino P. <rails-mailing-l...@andreas-
s.net> wrote:
>     posts.resources :comments
>   end
>
> I have basically posts and articles models which relate to the
> polymorphic model comment.
> Routes are generated as I expect to, but the problem resides in the
> comments_controller, since in this controller I'm not able to figure out
> if I'm creating a comment for a post or for an article.
>
> Is there a (possibly clean) way to solve this?

You can check for the presence of params[:post_id] or
params[:article_id] to discover the route that got triggered.

I generally use a before_filter:

class CommentsController < ApplicationController

 before_filter :determine_parent
 before_filter :ensure_valid_comment

 def determine_parent
  @parent = Article.find_by_id(params[:article_id]) ||
Post.find(params[:post_id]
 end

 def ensure_valid_comment
  return unless params[:id]
  raise ActiveRecord::RecordNotFound unless
@parent.comments.find(params[:id])
 end

end

This will first look for an article, and if that fails (returns nil),
it will assume it's a post.  Raises an exception of neither are
found.  The second filter helps ensure that someone didn't mess with
the url.

Does this help?

Jeff
purpleworkshops.com
softiesonrails.com
This topic is locked and can not be replied to.