Как мне создать ресурс, который является подмножеством существующего ресурса

В моем файле "rout.rb" есть следующая строка:

resource :users

что дает мне кучу именованных маршрутов для доступа к моей модели пользователя в режиме RESTful.

Теперь я сделал некоторые дополнения к модели User, включая создание специального класса user. Они все еще хранятся в модели User, но в базе данных есть "специальный" флаг, который определяет их как специальные.

Итак, возможно ли создать ресурс special_users? Например, я хотел бы иметь "special_users_path" в качестве именованного маршрута к "/ special_users", который будет возвращать индекс только специальных пользователей, когда вы выполняете GET для URL.

Есть ли способ сделать это?

2 ответа

Решение

В маршрутизации Rails "ресурс" относится к стандартным 7 маршрутам, которые созданы для ресурсов RESTful: index, show, new, create, edit, update а также destroy, Обычно этого достаточно, но иногда вы можете захотеть создать другое действие.

В модели вы хотите создать scope это только возвращает специальных пользователей:

class User < ActiveRecord::Base
  scope :special, where(:special => true)
end

На стороне контроллера есть два способа сделать это. То, что вы предлагаете, - это создание дополнительного действия:

match "/users/special" => "users#special"  
resource :users

В контроллере ваше специальное действие вернет только что созданную область:

class UsersController < ApplicationController
  def special
    @users = User.special
  end
end

Это будет делать то, что вы просите, но я бы посоветовал НЕ делать это таким образом. Что если позже вы добавите другие флаги, по которым хотите искать? Что делать, если вы хотите искать по нескольким флагам? Это решение недостаточно гибкое для этого. Вместо этого оставьте маршруты такими, какие они есть:

resource :users

и просто добавьте дополнительную строку к вашему контроллеру:

class UsersController < ApplicationController
  def index
    @users = User.all
    @users = @users.special if params[:special]
  end
end

и теперь, когда вы хотите отобразить специальных пользователей, просто направьте пользователя к /users?special=true

Этот подход гораздо более ориентирован на будущее, ИМО.

(Этот ответ предполагает, что Rails-3. Если вы все еще используете 2.3, дайте мне знать)

Вы можете установить special_users как ресурс:

resource :special_users

Если вам нужно указать его на специальный контроллер, вы можете указать его с помощью:

resource :special_users, :controller => :users

Но я бы действительно предложил вам не создавать другой контроллер для извлечения пользователей, а использовать параметр для их получения:

 class UsersController < ApplicationController
   def index
     users = case params[:type].to_s
               when "special"
                 User.special_users # Using named scopes
               else
                 User.all
             end
   end
 end

Когда вы используете users_path для вызова специальных пользователей:

users_path(:type => :special)
Другие вопросы по тегам