2010-09-20 16 views
13

Mam kilka klas, które każdy może mieć komentarze:Tworzenie formularzy dla polimorficznych stowarzyszeń w szynach

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 

Jak mogę utworzyć formularz dla nowego filmu-komentarzu? Dodałem

resources :movies do 
    resources :comments 
end 

do mojego routes.rb i spróbował new_movie_comment_path (@movie), ale to daje mi formularz zawierający commentable_id i commentable_type [który chcę być wypełniane automatycznie, nie wprowadzone przez użytkownika bezpośrednio]. Próbowałem też tworzenie postaci sobie:

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

(gdzie „text” jest to pole w tabeli komentarzu) ale to nie działa albo.

Nie wiem, jak skojarzyć komentarz z filmem. Na przykład,

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

nie wydają się tworzyć komentarz związany z filmu o identyfikatorze 1. (Movie.find (1) .comments zwraca pustą tablicę.)

Odpowiedz

6

Po utworzeniu skojarzenia polimorficznego w modelu nie trzeba już martwić się tym widokiem. Po prostu musisz to zrobić w swoim kontrolerze komentarzy.

@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

Jak utworzyć formularz do wpisania komentarza? Nie sądzę, żebym chciał "form_for @ movie.comments.create do | f | f.text_field: text; f.submit end", ponieważ chcę tylko utworzyć komentarz, jeśli jest rzeczywiście przesłany. I z jakiegoś powodu @ movie.comments.build nie wydaje się kojarzyć komentarza z filmem. – grautur

+0

Możesz dodać przycisk "Dodaj komentarz" na stronie filmu, który przekieruje Cię do strony edycji filmu z dodanym do niej polem komentarzy. Można to zrobić jak poniżej: – Rohit

+3

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

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

<% f.fields_for: komentarze zrobić | v | %>

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

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

3

Zamierzasz muszą być bardziej opisowe niż "... ale to nie działa albo", ale ogólna idea jest:

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

bardziej typowo:

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

Ważne jest, aby najpierw znaleźć @movie i utworzyć powiązane z nim obiekty. W ten sposób nie będziesz musiał się martwić o Commentable lub typy lub cokolwiek.

Powiązane problemy