У меня довольно распространенный случай для вложенных маршрутов, я чувствую, что выглядит примерно так (в какой-то псевдонетации):
'/:username/photos' => Show photos for User.find_by_username
'/photos' => Show photos for User.all
В двух словах: У меня есть пользователи. У них есть фотографии. Я хочу показать свои фотографии на своей странице. Я также хочу, чтобы показывать все фотографии, независимо от пользователя. Я бы хотел, чтобы мои маршруты RESTful и использование встроенных методов resource
чувствовали себя как правильный способ сделать это.
Вариант 1 для этого состоит в том, чтобы индекс PhotosController # использовал условие, чтобы проверить, какие параметры указаны, и получить список фотографий и установить представление (другое для фотографий пользователя, чем для всех фотографий). Это даже легко проложить маршрут:
resources :photos, :only => [:index]
scope ':/username' do
resources :photos
end
Boom. Казалось бы, для этого была настроена Rails. Однако после маршрутов все усложняется. Это условное выражение в действии indexController # index просто становится все более раздутым и делает очень много дегазации. По мере того, как приложение растет, а также количество способов, которыми я хочу показывать фотографии, это будет только ухудшаться.
Вариант 2 может состоять в том, чтобы пользовательский:: PhotosController обрабатывал пользовательские фотографии и PhotosController для обработки всех фотографий.
resources :photos, :only => [:index]
namespace :user, :path => '/:username' do
resources :photos
end
Это создает следующие маршруты:
photos GET /photos(.:format) {:action=>"index", :controller=>"photos"}
user_photos GET /:username/photos(.:format) {:action=>"index", :controller=>"user/photos"}
POST /:username/photos(.:format) {:action=>"create", :controller=>"user/photos"}
new_user_photo GET /:username/photos/new(.:format) {:action=>"new", :controller=>"user/photos"}
edit_user_photo GET /:username/photos/:id/edit(.:format) {:action=>"edit", :controller=>"user/photos"}
user_photo GET /:username/photos/:id(.:format) {:action=>"show", :controller=>"user/photos"}
PUT /:username/photos/:id(.:format) {:action=>"update", :controller=>"user/photos"}
DELETE /:username/photos/:id(.:format) {:action=>"destroy", :controller=>"user/photos"}
Это работает очень хорошо, я думаю, но все находится под модулем User, и я чувствую, что это может вызвать проблемы, когда я его интегрирую с другими вещами.
Вопросы
- Есть ли у кого-нибудь опыт в этом?
- Может ли кто-нибудь поделиться лучшим способом справиться с этим?
- Любые дополнительные плюсы и минусы, которые следует учитывать при любом из этих вариантов?
Обновление. Я уже реализовал вариант 2, потому что он чувствует себя более чистым, чем логика Rails, а не ее переопределение. Пока все идет хорошо, но мне также нужно было переименовать мое пространство имен в :users
и добавить :as => :user
, чтобы он не столкнулся с моей моделью User
. Я также переопределил метод to_param
модели User
, чтобы вернуть имя пользователя. Помощники по пути все еще работают так же.
Я по-прежнему ценю отзывы об этом методе. Я делаю то, что ожидал, или я злоупотребляю этой функциональностью?