#ruby-on-rails #ruby-on-rails-3 #routes
#ruby-on-rails #ruby-on-rails-3 #маршруты
Вопрос:
В rails 2.x я использовал мелкие маршруты, но, похоже, этого нет в rails 3 (по крайней мере, в API http://apidock.com/rails/ActionController/Resources/resources).
Когда я передаю эту опцию в rails 3, она не выдает никаких ошибок, но я также не получаю все маршруты, которые я ожидал.
Рельсы 3 маршрута.rb
resources :users, :shallow=>true do
resources :recipe do
resources :categories do
resources :sections do
resources :details do
end
end
end
end
end
Отсутствуют маршруты, которые были сгенерированы с помощью эквивалента rails 2.x (просто образец для ресурса рецепта):
ПОЛУЧАЕМ new_recipe (у меня есть только new_user_recipe) и
ОПУБЛИКОВАТЬ рецепт (чтобы создать новый рецепт, у меня есть только POST user_recipe)
Отчасти имеет смысл, что эти маршруты не будут сгенерированы, но мой старый код обходил это, передавая user_id в каждой форме (менее элегантно, согласен).
Вопрос в том, есть ли документация для «неглубоких» маршрутов в rails 3? Есть ли способ сгенерировать маршруты, которых мне не хватает в rails 2.x?
Спасибо, Майк
Ответ №1:
Вам нужно применить параметр :shallow к вложенным ресурсам. Это должно дать вам то, что вы хотите:
resources :users do
resources :recipe, :shallow=>true do
resources :categories do
resources :sections do
resources :details do
end
end
end
end
end
Комментарии:
1. Но в документах API (по крайней мере, для 2.x) говорится, что: мелкие маршруты наследуются? Тем не менее, я попробовал, но, похоже, это не сработало.
Ответ №2:
Если вы посмотрите на документы Rails 3, вы увидите, что shallow
это метод экземпляра на ActionDispatch::Routing::Mapper::Resources
, точно так же, как resource
, resources
, match
и т.д. Вы должны иметь возможность объединять мелкие маршруты с чем-то вроде этого:
shallow do
resources :users do
resources :recipe do
resources :categories do
resources :sections do
resources :details
end
end
end
end
end
Хотя кажется, что это расширяет их только до 2 уровней, а не до полного вложенного маршрута. Ознакомьтесь rake routes
для получения дополнительной информации.
Ответ №3:
Документацию Rails 3, касающуюся вложенных или неглубоких маршрутов, можно найти на сайте Rails Guides.
Предлагая советы о том, как вложить маршруты, в нем конкретно говорится, что «Ресурсы никогда не должны быть вложены глубиной более 1 уровня».
Ответ №4:
Разумно, что у вас есть только new_user_recipe вместо new_recipe. Почему? Потому что с точки зрения рецепта, каждый рецепт в значительной степени принадлежит пользователю.
Другой момент заключается в том, что
resources :users, :shallow=>true do
resources :recipe do
resources :categories do
resources :sections do
resources :details do
end
end
end
end
end
точно такой же, как
resources :users do
resources :recipe, :shallow=>true do
resources :categories do
resources :sections do
resources :details do
end
end
end
end
end
:shallow
наследуется, как указывали другие пользователи. Подумайте об этом, :shallow
это означает, что вы можете опустить левую часть шаблона URL, как только будете уверены, с каким именно ресурсом вы работаете. Если вы разместите :shallow
на самом внешнем слое вашего ресурса, это должно иметь тот же эффект, что и при размещении на втором слое (рецепт в вашем примере). Поскольку вам нечего опускать, когда вы работаете с самым внешним ресурсом (пользователями в вашем примере), это уже самая левая часть шаблона URL, и ее нельзя опустить.