Как мне создать ресурс, который является подмножеством существующего ресурса - PullRequest
0 голосов
/ 12 ноября 2010

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

resource :users

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 12 ноября 2010

Вы можете установить 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)
0 голосов
/ 12 ноября 2010

В маршрутизации 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, дайте мне знать)

...