2010-09-20 20 views
13

tôi có một vài lớp mà mỗi thanh lại có nhận xét nào:Tạo biểu mẫu cho các hiệp hội đa hình trong 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 

Làm thế nào để tạo ra một hình thức cho một bộ phim bình luận mới? Tôi thêm

resources :movies do 
    resources :comments 
end 

để routes.rb của tôi, và cố gắng new_movie_comment_path (@movie), nhưng điều này mang lại cho tôi một hình thức có chứa commentable_id và commentable_type [mà tôi muốn trở nên thông dụng tự động, không được nhập bởi người sử dụng trực tiếp]. Tôi cũng đã cố gắng tạo ra các hình thức bản thân mình:

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

(nơi "văn bản" là một lĩnh vực trong bảng Comment) nhưng điều này không làm việc, hoặc.

Tôi thực sự không chắc chắn cách liên kết nhận xét với phim. Ví dụ,

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

dường như không tạo ra một bình luận liên quan đến bộ phim với id 1. (Movie.find (1) .comments trả về một mảng trống.)

Trả lời

6

Khi bạn đã tạo liên kết đa hình trong mô hình của mình, bạn không cần phải lo lắng về điều đó nữa trong chế độ xem. Bạn chỉ cần thực hiện việc này trong bộ điều khiển Nhận xét của mình.

@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

Làm cách nào để tạo biểu mẫu để nhập nhận xét? Tôi không nghĩ rằng tôi muốn "form_for @ movie.comments.create do | f | f.text_field: text; f.submit end", bởi vì tôi chỉ muốn tạo nhận xét nếu nó thực sự được gửi. Và vì lý do nào đó, @ movie.comments.build dường như không liên kết nhận xét với phim. – grautur

+0

Bạn có thể thêm nút 'Thêm nhận xét' trên trang Trình diễn phim sẽ chuyển hướng bạn đến trang chỉnh sửa phim có thêm trường nhận xét. Điều này có thể được thực hiện như sau: – Rohit

+3

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

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

<% f.fields_for: ý kiến ​​làm | v | %>

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

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

3

Bạn sẽ phải có nhiều mô tả hơn "... nhưng điều này không làm việc, hoặc," nhưng ý tưởng chung là:

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

thường thêm:

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

Điều quan trọng là bạn tìm thấy @movie trước tiên và tạo các đối tượng liên quan của bạn thông qua nó. Bằng cách đó bạn sẽ không phải lo lắng về Commentable hoặc các loại hoặc bất cứ điều gì.

Các vấn đề liên quan