Как мне создать ресурс, который является подмножеством существующего ресурса
В моем файле "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)