Храните отзывы вложенных в продуктах, но переместить создание для обзоров снаружи:
# routes.rb
resources :products do
resources :reviews, except: [:new, :create]
end
resources :reviews, only: [:new, :create]
Затем используйте new_review_path
, чтобы создать новый отзыв.
Если вы хотите иметь возможность создать обзор, прикрепленный к определенному продукту или нет, оставьте опцию: except для вашего вложенного обзора и измените действие и форму вашего контроллера на основе product_id.present ?.
EDIT: (В ответ на прослеживания вопрос зефира в)
В приведенном выше примере, я указал, что :new
и :create
должны быть доступны только внешние продукты, а не внутри него используя опции :except
и :only
для обзоров - не стесняйтесь их бросать, если вы хотите что-либо делать с отзывами независимо от того, вложен ли это или нет. Единственное, о чем нужно быть осторожным, это то, что одни и те же действия контроллера будут обрабатывать запросы независимо от того, вложен ли они или нет: reviews#index
будет обрабатывать как /reviews
, так и /products/1/reviews
, например, так что вам нужно убедиться, что ваш контроллер правильно обрабатывает. Например, с использованием перед фильтром:
# users_controller.rb
before_filter :filter_by_product
def filter_by_product
@parent_product = Product.find(params[:product_id]) if params[:product_id]
@reviews = @parent_product ? @parent_product.reviews : Review.all
end
def new
@review = @reviews.build
end
...
Вы также, возможно, потребуется внести изменения в вашей точки зрения на основе будь то вложенными или нет. Например, в вашей форме для создания обзора вы можете использовать выпадающий список продуктов, если он не вложен или не заменяет его скрытым полем с product_id
, если это так.
BTW, почему у вас есть @product = Product.new, в вашем действии? –