Понимание маршрутизации в рельсах 3
-
25-09-2019 - |
Вопрос
Я думаю, что я думаю о маршрутизации всех не так. У меня очень простые, две модели модели: продукт и фото. Продукт has_many: Фотографии и фото принадлежат_то: продукт.
Продукт имеет полный леса, а фото имеет фотографии_Controller, над которым я работаю.
В маршрутах. resources :products
(сгенерировано летаком)
Поскольку фотографии - это вложенный ресурс продукта, я изменил это на:
resources :products do
resources :photos
end
и наконец:
root :to => "products#index"
Happy Reark Roures выплевывает:
products GET {:controller=>"products", :action=>"index"}
products POST {:controller=>"products", :action=>"create"}
new_product GET {:controller=>"products", :action=>"new"}
edit_product GET {:controller=>"products", :action=>"edit"}
product GET {:controller=>"products", :action=>"show"}
product PUT {:controller=>"products", :action=>"update"}
product DELETE {:controller=>"products", :action=>"destroy"}
product_photos GET {:controller=>"photos", :action=>"index"}
product_photos POST {:controller=>"photos", :action=>"create"}
new_product_photo GET {:controller=>"photos", :action=>"new"}
edit_product_photo GET {:controller=>"photos", :action=>"edit"}
product_photo GET {:controller=>"photos", :action=>"show"}
product_photo PUT {:controller=>"photos", :action=>"update"}
product_photo DELETE {:controller=>"photos", :action=>"destroy"}
products GET {:controller=>"products", :action=>"index"}
products POST {:controller=>"products", :action=>"create"}
new_product GET {:controller=>"products", :action=>"new"}
edit_product GET {:controller=>"products", :action=>"edit"}
product GET {:controller=>"products", :action=>"show"}
product PUT {:controller=>"products", :action=>"update"}
product DELETE {:controller=>"products", :action=>"destroy"}
root {:controller=>"products", :action=>"index"}
Это означает, что форма в продуктах / новых будет опубликовать в продуктах # создавать, что я хочу затем перенаправить на фотографии # новые и иметь форму для загрузки продукта_Фото, сгенерированные соответствующими фотографиями / new.html.erb, которые будут публиковать на фотографии # Создать, верно?
В Product_Controller.rb:
def create
@product = Product.new(params[:product])
respond_to do |format|
if @product.save
redirect_to new_product_photo_path, :notice => 'Product was successfully created.'
else
render :action => "new"
end
end
end
А в фото_controller.rb (на данный момент):
def new
@photo = Photo.new
end
Так почему о, почему я получаю:
Routing Error
No route matches {:controller=>"photos", :action=>"new"}
Когда у меня ясно, что я делаю, у меня есть фотографии_Controller, новое действие в фотографиях_Controller, а new_product_photo_path явно просит пойти правильно? (У меня также есть фотографии / new.html.erb, которая имеет простой <h1>Photos</h1>
для чего-то, чтобы сделать).
Я могу только сделать вывод, что я думаю об этом все неправильно, или что я сделал ошибку в Конвенции над конфигурацией, которую я не вижу.
Кто-нибудь?
Спасибо и добрые пожелания, Адам
Решение
Обновленный ответ:
Использование вложенного ресурса означает (в этом случае), что вы можете создать только новое фото в контексте продукта. Это означает, что приложение должно знать, какой продукт будет создан фотография.
В случае вашего перенаправления это означает, что вы должны добавить объект продукта в качестве параметра для new_product_photo_path
:
redirect_to new_product_photo_path(@product)
Оригинальный ответ:
Это потому, что вы сделали его вложенным ресурсом. /products/1/photos/new
вероятно, работает. Если вы хотите иметь возможность создавать новые фотографии через /photos/new
ТОО тоже нужно добавить «ненужный» ресурс тоже.