2010-09-20 9 views
13

que tienen un par de clases que pueden tener cada uno de observaciones:formas Creación de asociaciones polimórficas en los carriles

class Movie < ActiveRecord::Base 
    has_many :comments, :as => :commentable 
end 

class Actor < ActiveRecord::Base 
    has_many :comments, :as => :commentable 
end 

class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true 
end 

¿Cómo se crea un formulario para una nueva película-comentario? Añadí

resources :movies do 
    resources :comments 
end 

a mi routes.rb, y trató new_movie_comment_path (@movie), pero esto me da un formulario que contiene commentable_id y commentable_type [lo que yo quiero a poblarse de forma automática, no entró por el usuario directamente]. También intenté crear la forma yo:

form_for [@movie, Comment.new] do |f| 
    f.text_field :text 
    f.submit 
end 

(donde "texto" es un campo de la tabla comentario) pero esto no funciona bien.

No estoy seguro de cómo asociar un comentario con una película. Por ejemplo,

c = Comment.create(:text => "This is a comment.", :commentable_id => 1, :commentable_type => "movie") 

no parece crear un comentario asociado a la película con id 1. (Movie.find (1) .comments devuelve una matriz vacía.)

Respuesta

6

Como ha creado la asociación polimórfica en su modelo, ya no tiene que preocuparse por eso en la vista. Solo necesita hacer esto en su controlador de Comentarios.

@movie = Movie.find(id) # Find the movie with which you want to associate the comment 
@comment = @movie.comments.create(:text => "This is a comment") # you can also use build 
# instead of create like @comment = @movie.comments.create(:text => "This is a comment") 
# and then @comment.save 
# The above line will build your new comment through the movie which you will be having in 
# @movie. 
# Also this line will automatically save fill the commentable_id as the id of movie and 
# the commentable_type as Movie. 
+3

¿Cómo construyo un formulario para ingresar el comentario? No creo que quiera "form_for @ movie.comments.create do | f | f.text_field: text; f.submit end", porque solo quiero crear el comentario si realmente se envió. Y, por alguna razón, @ movie.comments.build no parece asociar el comentario con la película. – grautur

+0

Puede agregar un botón 'Agregar comentario' en la página de la película que lo redirigirá a la página de edición de la película con el campo de comentarios agregado. Esto se puede hacer de la siguiente manera: – Rohit

+3

<% form_for (@movie) do | f | %> <% =% f.error_messages>

<% = f.label: Nombre%>
<% = f.text_field: Nombre%>

<% f.fields_for: hacer comentarios | v | %>

<% = v.label: Comentario%> <% = v.text_area: Comentario%>

<% end %> <% end %> – Rohit

3

Vas a tiene que ser más descriptivo que "... pero esto no funciona bien", pero la idea general es:

@movie.comments.create(:text => params[:movie][:comment][:text]) 

más típicamente:

@movie.comments.create(params[:comment]) # or params[:movie][:comment] 

Lo importante es encontrar primero @movie y crear los objetos asociados a través de él. De esta forma, no tendrá que preocuparse por Commentable ni por tipos ni nada.

Cuestiones relacionadas