Как мне написать / организовать свои контроллеры и маршруты Rails, чтобы разрешить доступ к глубоко вложенным ресурсам на каждом уровне? - PullRequest
1 голос
/ 27 октября 2011

Прежде всего, Коридор спрашивает и хорошо отвечает на этот вопрос на мелком уровне, но я не очень хорошо понимаю.

Если я остановлюсь на примере с coreyward, я могу представить себе фото-сайт, который намерен подчеркнуть курирование. Фотографии предназначены для отображения в альбомах, и одна фотография может появляться во многих альбомах. Кроме того, фотографии имеют много тегов.

Итак, пользователь has_many: альбомы,: фотографии и: теги, альбом has_many: фотографии и: теги (в виде фотографий), фотография has_many: теги и т. Д.

Таким образом, основной способ посмотреть на фотографию будет через / users / 123 / album / 456 / photos / 789. Фотографии будут иметь уникальный идентификатор, поэтому я мог бы просто получить доступ к / photos / 789, но я думаю, что URL-адрес является ценным инструментом для поиска путей в пользовательском опыте, и я бы предпочел, чтобы было ясно, что это фотография в определенном альбоме, принадлежащем конкретный пользователь. Как и Coreyward, я также хотел бы использовать тщеславные URL (URL-слагы) в нескольких местах.

Даже если бы я направлял действия #show и #index самым простым способом (например, / photos / 789 и / album / 456 / photos), #new и #create были бы немного более проблематичными. Если бы я открыл / users / 123 / album / 456 / photos / new, пользователь мог бы загрузить фотографию, которая получала бы идентификатор user_id 123, и приложение было бы достаточно умным, чтобы создать запись в таблице объединения (album_photos или что у вас) без попросить пользователя сделать эту связь в отдельном шаге.

Будут сценарии, когда кто-то, в зависимости от разрешений, захочет увидеть / users / 123 / photos или просто / photos, / album, / tags.

Я бы хотел избежать условной логики в контроллерах, подобных предложенному coreyward, но иметь app / controllers / photos_controller.rb, app / controllers / users / photos_controller.rb и app / controllers / users / album / photos_controller.rb кажется противным

Как мне поступить с чем-то вроде этого (в Rails 3)?

Спасибо!

1 Ответ

1 голос
/ 27 октября 2011

Вы все неправильно поняли, чувак.Вам не нужно иметь users/photos_controller.rb ни при каких обстоятельствах.Вы можете просто иметь users_controller.rb и photos_controller.rb, а затем получить все необходимое для маршрутизации:

resources :users do
  resources :albums do
    resources :photos
  end
end

# and also provide unnested access to photos and albums
resources :photos, :albums

посмотрите здесь для некоторых примеров, НО обратите внимание, где написано: "Ресурсы никогда не должны быть вложены глубже, чем на 1 уровень".Все будет очень быстро, особенно когда вы начнете писать барахло:

link to 'photo', users_albums_photos_path(:user_id => 3, :album_id => 7)

YUCK!Действительно, вложенная маршрутизация - это то, что следует использовать экономно и избегать любой ценой.То, что вы описываете, совсем не похоже на хорошую кандидатуру для вложенной маршрутизации (тот факт, что я могу загрузить картинку без ее альбома - это красный флаг).Есть и другие способы защиты доступа к ресурсам, кроме маршрутов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...