2010-09-20 6 views
13

J'ai une de deux classes qui peuvent avoir chacun des commentaires:Création de formulaires pour les associations polymorphes dans Rails

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 

Comment puis-je créer un formulaire pour un nouveau film-commentaire? J'ai ajouté

resources :movies do 
    resources :comments 
end 

à mon routes.rb, et essayé new_movie_comment_path (@movie), mais cela me donne une forme contenant commentable_id et commentable_type [que je veux être rempli automatiquement, pas entré par l'utilisateur directement]. J'ai aussi essayé de créer moi-même la forme:

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

(où « texte » est un champ dans la table Commentaire) mais cela ne fonctionne pas non plus.

Je ne suis pas sûr de savoir comment associer un commentaire à un film. Par exemple,

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

ne semble pas créer un commentaire associé au film avec id 1. (Movie.find (1) .comments retourne un tableau vide.)

Répondre

6

Comme vous avez créé l'association polymorphique dans votre modèle, vous n'avez plus à vous en soucier dans la vue. Vous avez juste besoin de le faire dans votre contrôleur de commentaires.

@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

Comment créer un formulaire pour entrer le commentaire? Je ne pense pas que je veux "form_for @ movie.comments.create do | f | f.texte_field: texte; f.submit end", parce que je veux seulement créer le commentaire s'il est réellement soumis. Et pour une raison quelconque, @ movie.comments.build ne semble pas associer le commentaire au film. – grautur

+0

Vous pouvez ajouter un bouton 'Ajouter un commentaire' sur la page d'émission de film qui vous redirigera vers la page d'édition de film avec le champ Commentaires ajouté. Cela peut être fait comme suit: – Rohit

+3

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

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

<% f.fields_for: Les commentaires ne | v | %>

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

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

3

Vous allez doivent être plus descriptif que « ... mais cela ne fonctionne pas non plus, » mais l'idée générale est:

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

plus généralement:

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

L'important est que vous trouviez d'abord @movie et que vous y créiez vos objets associés. De cette façon, vous ne devrez pas vous soucier de Commentable ou types ou quoi que ce soit.

Questions connexes