Creating forms for polymorphic associations in Rails

空扰寡人 提交于 2019-12-03 16:07:30

问题


I have a couple classes that can each have comments:

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

How do I create a form for a new movie-comment? I added

resources :movies do
    resources :comments
end

to my routes.rb, and tried new_movie_comment_path(@movie), but this gives me a form containing commentable_id and commentable_type [which I want to be populated automatically, not entered by the user directly]. I also tried creating the form myself:

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

(where "text" is a field in the Comment table) but this doesn't work either.

I'm not actually sure how to associate a comment with a movie at all. For example,

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

doesn't seem to create a comment associated to the movie with id 1. (Movie.find(1).comments returns an empty array.)


回答1:


As you have created the polymorphic association in your model, you need not worry about that anymore in the view. You just need to do this in your Comments controller.

@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.



回答2:


You're going to have to be more descriptive than "...but this doesn't work either," but the general idea is:

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

More typically:

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

The important thing is that you find @movie first and create your associated objects through it. That way you won't have to worry about Commentable or types or anything.



来源:https://stackoverflow.com/questions/3748596/creating-forms-for-polymorphic-associations-in-rails

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!