4

Ich arbeite an meiner ersten polymorphen Assoziationsbeziehung und ich habe Probleme beim Refactoring meiner form_for create Kommentare.Refactoring Form_for Create-Methode für Kommentare in einer polymorphen Assoziation

Ich habe versucht, durch die polymorphe Association RailsCasts http://railscasts.com/episodes/154-polymorphic-association?view=asciicast gehen, aber es scheint veraltet.

Ich habe zwei Fragen:

  1. Wie umschreiben ich meine comment_form teilweise so, dass es kommentierbaren für alles funktionieren würde? So wie ich es jetzt habe, würde es nur für Reisedeals funktionieren seit (:commentable_id => @traveldeal.id).

  2. Wenn ich den Kommentar erstelle, ist der commentable_type leer. Was ist commentable_type und muss ich es im Formular übergeben?

Vielen Dank!

user.rb

class User < ActiveRecord::Base 
    has_many :comments, :dependent => :destroy 
end 

traveldeal.rb

class Traveldeal < ActiveRecord::Base 
    has_many :comments, :as => :commentable, :dependent => :destroy 
end 

comment.rb

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

    validates :user_id, :presence => true 
    validates :commentable_id, :presence => true 
    validates :content, :presence => true 
end 

traveldeal_show.html.erb

<%= render 'shared/comment_form' %> 

_comment_form.html.erb

<%= form_for current_user.comments.build(:commentable_id => @traveldeal.id) do |f| %> 
    <%= render 'shared/error_messages', :object => f.object %> 

<div> 
    <%= f.text_area :content %> 
</div> 

<%= f.hidden_field :user_id %> 
<%= f.hidden_field :commentable_id %> 

<div> 
    <%= f.submit "Add Comment" %> 
</div> 
<% end %> 

comments_controller.rb

class CommentsController < ApplicationController 
    before_filter :authenticate, :only => [:create, :destroy] 

    def create 
    @comment = Comment.new(params[:comment]) 
    @comment.save 
    redirect_to root_path 
    end 

end 

Antwort

2

Der einzige Teil, der in der Railscast sind die Routen datiert ist.

Ihre erste Frage zu beantworten: Erstellen Sie Ihre Form, wie es in der Railscast getan wird:

<%= form_for [@commentable, Comment.new] do |f| %> 
    <p> 
    <%= f.label :content %><br /> 
    <%= f.text_area :content %> 
    </p> 
    <p><%= f.submit "Submit" %></p> 
<% end %> 

Wenn Sie es tun, wie diese commentable_type automatisch eingestellt wird. Sie benötigen den Typ, damit Sie wissen, zu welchem ​​Modell ein Kommentar gehört. Beachten Sie, dass Sie in der Methode, in der Sie das Kommentarformular verwenden, @commentable festlegen müssen.

z.

+0

Danke, dass Sie mir bei dieser Sache geholfen haben, Mischa. Ich habe es versäumt, @commentable für die Show-Seite zu setzen, wie deine Antwort angezeigt hat. – Huy

+0

Was macht die params [@commentable, Comment.new]? Ich bin mir nicht ganz sicher, was der Kommentar in diesem Zusammenhang bedeutet. Wird nur ein neuer Datensatz erstellt, ähnlich wie wenn er im Controller angezeigt wird? – Huy

+2

Da Sie eine verschachtelte Route haben, benötigen Sie zwei Objekte für Ihr 'form_for'. Der erste ist das Objekt, zu dem der Kommentar gehört ('@ commentable'), der zweite ist das neue Kommentarobjekt (' Comment.new'). Es ist also so, als würde man einen neuen Datensatz im Controller erstellen. Du könntest '@comment = Comment.new' im Controller tun, aber das musst du überall tun, wo du das Kommentarformular hast. Es ist sauberer, in der Ansicht einfach 'Kommentar.neu 'zu machen. – Mischa

Verwandte Themen