Существует принципиальное различие между моделью внутреннего домена вашей системы и открытым интерфейсом , которую ваша система предоставляет.
Если вы используете реляционную базу данных, рекомендуется иметь
Comment.belongs_to :post
Post.has_many :comments
Модель внутреннего домена вашей системы может помочь вам спроектировать ваш общедоступный интерфейс, но вы также можете адаптировать свой открытый интерфейс так, как вы этого хотите, не заставляя его строго отражать модель внутреннего домена!
В вашем случае я бы предложил иметь CommentsController
. Но в этом классе контроллеров вам не нужны все обычные действия REST. Вам нужно только несколько из них.
# app/controllers/comments_controller.rb
class CommentsController < ApplicationController
respond_to :js
def create
@post = Post.find(params[:post_id])
@comment = post.comments.create(params[:comment])
respond_with [@post, @comment]
end
end
В этом контроллере у вас only есть действие create
, которое будет целью формы "новый комментарий" в нижней части страницы с сообщением. Вам не нужны никакие другие действия REST, потому что люди никогда не просматривают, не редактируют и не удаляют комментарии изолированно - они только создают новые, а не со специальной страницы новых комментариев. Маршрутизация для этого выглядит следующим образом:
# config/routes.rb
MyApp::Application.routes.draw do
resources :posts do
resources :comments, :only => [:create]
end
end