Я понимаю, что мы должны избегать введения логики в контроллер.Итак, как правильно реализовать такие вещи, как контроль доступа пользователей.Предположим, у меня есть User
, где у каждого экземпляра есть метод флага admin?
, который определяет, может ли пользователь получить доступ к информации от других пользователей.
Вариант 1: добавить элементы управления доступом в пользовательскую модель
Модель:
class User < ActiveRecord::Base
def self.get_list(accessor)
return [] unless accessor.admin?
self.all
end
end
Контроллер:
class UsersController < ApplicationController
def index
@users = User.get_list(current_user)
end
end
current_user
будетвозможно, определено где-то в контроллере приложения.
Вариант 2: Поместите элементы управления доступом в контроллер
Модель:
class User < ActiveRecord::Base
end
Контроллер:
class UsersController < ApplicationController
def index
@users = current_user.admin? User.all : []
end
end
Существуют также некоторые второстепенные последствия, например, куда идут тесты и как они реализованы.
Мой инстинкт заключается в том, что первый из двух вариантов предпочтительнее, но я только когда-либо использовал параметр2 в прошлом.Кроме того, похоже, что общепринятая (насколько я могу судить) практика установки фильтров доступа для всего действия выполняется на уровне контроллера, как в:
class UsersController < ApplicationController
before_filter :verify_logged_in
end