2009-08-31 3 views
0

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

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

ответ

1

ОК, это то, о чем я думал о себе при работе с 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 использовать объект или коллекция помощники (в зависимости от действия). таким образом, load_object/load_collection в реализации реализации RC будет использовать то же значение, кэшированное из вашего использования помощника, поэтому никаких дополнительных запросов не будет.
+0

Да, это звучит правильно - я проигнорировал факт его кэширования. –

0

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

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

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

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

+0

yep вы пропустили, его определяют по безопасности объекта (собственности), которая имеет проблемы. Но Виталий прямо там, его кешировало, поэтому я мог использовать до фильтрации. –

0

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

  1. Использование around_filter
  2. На Перед крючке, бросить AccessDeniedException
  3. Захват исключения в окружающем фильтре

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

0

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

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

Смежные вопросы