У меня проблемы с полиморфной ассоциацией в Rails. У меня есть приложение, где должна быть возможность комментировать разные модели, например Posts, Images, Projects
Прямо сейчас у меня есть только сообщения, чтобы комментировать. На стартовой странице есть индексное представление последних сообщений, и у каждого сообщения есть небольшая форма комментария, чтобы комментировать через Ajax, очень похоже на Facebook.
Мои модели выглядят так:
class Post < ActiveRecord::Base
belongs_to :post_category
belongs_to :user
has_many :comments, :as => :commentable
validates_presence_of :user_id
validates_presence_of :post_category_id
validates_presence_of :title
validates_presence_of :body
end
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :commentable, :polymorphic => true
end
Теперь в моем контроллере комментариев я добавил следующий метод (я думаю, что я взял его из Railscasts или что-то в этом роде), который, как я предполагаю, пытается динамически определить @commentable при создании комментария.
Но это всегда возвращает ошибку undefined method
comments 'для nil: NilClass`
# find commentable (parent) item
def find_commentable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value) unless name == 'user_id'
end
end
nil
end
def create
@commentable = find_commentable
@comment = @commentable.comments.build(params[:comment])
if @comment.save
redirect_to @comment, :notice => 'Comment was successfully created.'
redirect_to :id => nil
else
render :action => "new"
end
end
Две вещи, которые я пробовал в своей части, были:
оставляя комментируемую информацию вне формы
= form_for [@commentable, Comment.new],: remote => true do | f |
# new_comment.add_comment
= f.hidden_field: user_id,: value => current_user.id
= f.text_field: content,: size => 55,: value => 'оставить комментарий ...',: class => 'comment_form'
= f.submit "отправить"
и 2. передача commentable_id и commentable_type
= form_for [@commentable, Comment.new], :remote => true do |f|
#new_comment.add_comment
= f.hidden_field :user_id, :value => current_user.id
= f.hidden_field :commentable_id, :value => post_id
= f.hidden_field :commentable_type, :value => 'Post'
= f.text_field :content, :size => 55, :value => 'leave a comment...', :onfocus => 'this.select()', :class => 'comment_form'
= f.submit "send"
оба без везения. Любая помощь будет высоко оценен.
весь код контроллера комментариев находится в этой сущности: https://gist.github.com/1334286