Рельсы 3, мелкие маршруты

#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, и ее нельзя опустить.