2013-05-07 3 views
0

Я знаю, что во вложенном ресурсе вам нужно передать идентификатор содержащего ресурса для его работы.Rails - путь к вложенному ресурсу при хранении ресурса не установлен

Однако я хочу разрешить пользователям создавать обзор продукта и указывать продукт в форме в новом представлении, а не передавать его на маршруте. Таким образом, вместо того, чтобы быть на продукте, а затем просмотреть его, будет создана основная обзорная форма, в которой вы можете выбрать любой продукт в форме.

Я получаю сообщение об ошибке, пытаясь это сделать, и не могу понять это - какое решение?

#error 
No route matches {:action=>"new", :controller=>"reviews"}  

#view 
new_product_review_path 

#controller 
def new 
    #@product = Product.new 
    @review = Review.new 
end 

#routes.rb 
resources :products do 
    resources :reviews 
end 
+0

BTW, почему у вас есть @product = Product.new, в вашем действии? –

ответ

1

Храните отзывы вложенных в продуктах, но переместить создание для обзоров снаружи:

# 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, если это так.

+0

Могу ли я просто добавить ресурсы: обзоры за пределами блока продуктов в файле маршрутов И сохранить его там и, следовательно, иметь доступ как к вложенному, так и к ненужному ресурсу? Я видел это в других ответах stackoverflow – Zephyr4434

+0

Да, ничто не мешало вам это делать, на что я указывал в конце своего ответа. В этом случае оба пути будут вызывать одно и то же действие контроллера, поэтому вам нужно убедиться, что он (и, возможно, ваши представления) ведет себя соответствующим образом. Я добавил немного моего ответа, чтобы расширить его. –

+0

Большое спасибо за подробный ответ – Zephyr4434

-1

перебрасывать ресурсы: отзывы вне блока

resources :products 
resources :reviews 

и использовать

new_review_path 

Таким образом, ваши отзывы не привязаны к какому-либо продукту.

+0

Есть ли другой способ исправить это? Для моего приложения обзоры имеют смысл только в контексте продуктов, поэтому кажется, что идеальная ситуация для использования вложенных маршрутов ... – Zephyr4434

0

Вы можете использовать namespace вещи, чтобы обернуть свой маршрут с чем-то другими

+0

Я не уверен, что понимаю, не могли бы вы быть более конкретными? Извините, только новичок в этом. – Zephyr4434

Смежные вопросы