# \[rails\] Problema polimorfismo

**URL:** <https://www.ruby-forum.com/t/rails-problema-polimorfismo/150871>\
**Category:** IT\
**Created:** [October 14, 2008, 12:12pm UTC](https://www.ruby-forum.com/t/rails-problema-polimorfismo/150871 "2008-10-14T12:12:27Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![serpico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@serpico](https://www.ruby-forum.com/u/serpico)\
**Post date:** [October 14, 2008, 12:12pm UTC](https://www.ruby-forum.com/t/rails-problema-polimorfismo/150871/1 "2008-10-14T12:12:27Z")

</div>

Salve a tutti,

ho riscontrato un problema relativo alle associazioni polimorfiche,  
magari qualcuno puÃ² darmi qualche dritta.

Ho un modello comments polimorfico, che puÃ² quindi essere associato a un  
numero indefinito di altri modelli. Nel mio caso:

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

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

Sia articoli che posts possono essere commentati.

Le routes sono ok e funzionano come mi aspettavo, il problema Ã© il mio  
comments\_controller.  
In pratica se voglio creare un nuovo commento (per es. dall’url  
/posts/2/comments/new) non ho modo nel metodo new di comments\_controller  
di capire se sto commentando un articolo o un post.

Qualcuno sa come risolvere?

Grazie

---

<div class="post-metadata">

**Author:** ![serpico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@serpico](https://www.ruby-forum.com/u/serpico)\
**Post date:** [October 14, 2008, 5:08pm UTC](https://www.ruby-forum.com/t/rails-problema-polimorfismo/150871/2 "2008-10-14T17:08:13Z")

</div>

Ciao,  
cerco di mostrarti una possibile soluzione  
Prima di tutto devi modificare le routes  
così:  
…  
map.resources :posts do |post|  
post.resources :comments, :controller =\> :post\_comments  
end

map.resources :articles do |article|  
article.resources :comments, :controller =\> :article\_comments  
end  
…

in questo modo mappi i commenti in due controller diversi in base alla  
risorsa “padre”.  
quindi devi definire due controllers che estendono il controller  
CommentsController  
così:  
class ArticleCommentsController \< CommentsController  
protected  
def load\_parent  
@parent = Article.find(params[:article\_id])  
end  
end

class PostCommentsController \< CommentsController  
protected  
def load\_parent  
@parent = Post.find(params[:post\_id])  
end  
end

il metodo protected load\_parent viene chiamato con before\_filter nella  
classe CommentsController, serve per caricare la risorsa padre del  
commento.  
Infine devi modificare il ComentsController

class CommentsController \< ApplicationController  
before\_filter :load\_parent  
…

in questo modo il methodo load\_parent viene chiamato prima di ogni  
azione  
poi puoi modificare il metodo create così (modificato dallo scaffold)

def create  
@comment = @parent.comments.build(params[:comment])

```
respond_to do |format|
  if @comment.save
    flash[:notice] = 'Comment was successfully created.'
    format.html { redirect_to(url_for([@parent, @comment])) }
    format.xml { render :xml => @comment, :status => :created,

```

:location =\> @comment }  
else  
format.html { render :action =\> “new” }  
format.xml { render :xml =\> @comment.errors, :status =\>  
:unprocessable\_entity }  
end  
end  
end

e nella vista new.html.erb

…  
\<% form\_for @comment, :url =\> url\_for([@parent,Comment.new]) do |f| %\>  
…

ciao

---

<div class="post-metadata">

**Author:** ![serpico](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7feea3/32.png) [@serpico](https://www.ruby-forum.com/u/serpico)\
**Post date:** [October 14, 2008, 5:25pm UTC](https://www.ruby-forum.com/t/rails-problema-polimorfismo/150871/3 "2008-10-14T17:25:08Z")

</div>

Grazie mille Ã© un’ottima idea! Io al momento avevo risolto passando il  
tipo di parent come argomento, ma cosÃ¬ Ã© piÃ¹ pulito nonostante si creino  
tanti controllers quante risorse.
