Правильный способ организации контроллеров с вложенными ресурсами (рельсы) - PullRequest
2 голосов
/ 03 октября 2011

Я надеюсь, что этот вопрос не слишком субъективен, но здесь идет.

Для простоты у меня есть модель User со многими вложенными ресурсами. Например, @user имеет много @books, @cars, @friends.

В представлении пользователя «показать» я предоставляю пользователю панель управления, на которой отображаются виджеты для всех их вещей (книг, автомобилей и друзей).

Моя проблема сейчас в том, что UsersController должен выполнять любую / всю логику, относящуюся к книгам, машинам и друзьям. А ввод логики для Книг и т. Д. В UsersController просто кажется неправильным.

Ответы [ 2 ]

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

В рельсах вы можете использовать вложенные ресурсы в ваших маршрутах, например:

resources :users do
  resources :books
end

Это даст вам что-то вроде

/users/id_of_user/books

Что попало бы в индекс вашего контроллера книг, просто проверьте доступность user_id внутри вашего контроллера книг и извлеките все книги, прикрепленные к текущему пользователю, если он там есть.

Используя ваши контроллеры и направляя их таким образом, вы можете легко распространить свою логику на более подходящие контроллеры и не допускать ее в свой пользовательский контроллер.

Ознакомьтесь с документацией ниже для получения дополнительной информации, например, о хитрых помощниках для ваших новых вложенных путей. http://guides.rubyonrails.org/routing.html#nested-resources

0 голосов
/ 20 июля 2012

Вскоре после комментирования я нашел: before_filter в руководстве по Rails. Используя это, вы можете вызывать действия в зависимости от того, найден ли вложенный ресурс и связанный шаблон. Это то, что я сделал, и хорошо работает для меня!

   before_filter :user_resource

      def user_resource
        return unless params[:user_id]
        redirect_to root_url and return unless params[:user_id] == current_user.id.to_s
        action = :"user_#{params[:action]}"
        if self.methods.include? action
          self.send action
          render action
        end
      end

и пример метода, который он вызывает

  def user_index
    ads = Classified.where(:owner_id => params[:user_id])
    @classifieds = ads
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...