Rails resource_controller с прерыванием? - PullRequest
0 голосов
/ 31 августа 2009

Я хочу использовать действие before для необязательного прерывания обработки, если оно не соответствует определенным критериям (например, объект не принадлежит такому пользователю и т. Д.)

Мне нужно использовать это, потому что у меня есть более сложный сценарий, который я нужно, чтобы объект был загружен, прежде чем права доступа могут быть определяется, поэтому у меня бывают ситуации, когда я хочу прервать действие, если это недопустимый доступ, в любом случае я мог бы добиться этого?

Ответы [ 4 ]

1 голос
/ 01 сентября 2009

ОК, я думал о себе, когда работал с RC.

обычное RC-действие выглядит примерно так:

def show
  load_object
  before :show
  response_for :show
rescue ActiveRecord::RecordNotFound
  response_for :show_fails
end

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

Лучший способ сделать это, о котором я мог подумать (кроме модификации RC :), это:

  • используйте before_filter , чтобы проверить условие
  • в before_filter используйте объект или collection помощников (в зависимости от действия). таким образом, load_object / load_collection в реализации действия RC будет использовать то же значение, которое кэшируется при использовании вами помощника, поэтому никаких дополнительных запросов не будет.
0 голосов
/ 13 мая 2010

Если вы очень часто пишете before_filters для проверки предварительных условий, вам может пригодиться Aegis . Он позволяет вам определять правила доступа в одном файле, чтобы вы могли сразу увидеть, кто и к чему может получить доступ.

Он также был построен для легкой интеграции с resource_controller.

0 голосов
/ 01 сентября 2009

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

  1. Использовать около_фильтра
  2. В хуке перед выбрасыванием AccessDeniedException
  3. Захватить исключение в обходном фильтре

Это бы тоже сработало.

0 голосов
/ 01 сентября 2009

Предполагается, что вы имеете в виду before_filter:

Любой вызов render или redirect должен прервать цепочку фильтров и выполнение действия. Поэтому просто поместите свой фильтр контроля доступа после того, чтобы загружать «вещи», а затем отобразите сообщение об ошибке (с соответствующим кодом состояния для хорошей веб-кармы и предотвращения сбоя w3c).

Это просто еще одна область рельсов, которая прекрасно работает, если не думать слишком усердно.

Любая помощь или я упускаю суть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...