Я думаю, у вас есть варианты:
Вариант 1)
По мнению:
<% form_for(@comment) do|f| %>
<%= f.hidden_field :commentable_id, :value => @book.id %>
<%= f.hidden_field :commentable_type, :value => 'Book' %>
<%= f.label :comment %><br />
<%= f.text_area :comment %>
<%= f.submit "Post Comment" %>
<% end %>
Контроллер:
def create
@comment = Comment.create(params[:comment])
end
Вариант 2)
В контроллере:
def create
@book = Book.find(params[:comment][:book_id])
@comment = @book.comments.create(params[:comment].except([:comment][:book_id]))
end
Я не проверял код, но идея должна быть правильной
Обновление, если вы хотите прокомментировать различные модели (я пишу свой код, не тестируя его ...). Допустим, у вас есть Книга и Журнал, и вы хотите прокомментировать их. Думаю, я бы определил для них вложенные маршруты.
map.resources :books, :has_many => :comments
map.resources :magazines, :has_many => :comments
И тогда в вашем контроллере вы можете сделать:
before_filter :find_commentable
def find_commentable
@commentable = Book.find(params[:book_id]) if params[:book_id]
@commentable = Magazine.find(params[:magazine_id]) if params[:magazine_id]
end
А в новом виде:
<% form_for :comment, [@commentable, @comment] do |f| %>
<%= f.label :comment %>
<%= f.text_area :comment %>
<%= f.submit %>
<% end %>
Таким образом, действие создания может выглядеть примерно так:
def create
@user.comments.create(params[:comment].merge(:commentable_id => @commentable.id, :commentable_type => @commentable.class.name))
redirect_to @commentable
end
Может быть, есть еще лучшие способы сделать это ...