Как я это сломал, как я это исправил и как я усвоил урок
Я выяснил проблему, когда лежал этим утром в постели, и все сводится к тому, что «я сделал что-то глупое». (Разве не всегда?)
Умная часть
Во-первых, умная часть: я последовал несколько полезных советов по настройке контроля доступа и разрешений . Это дает вам отличный синтаксис для описания того, что разрешено, например:
<%= link_to 'Delete', @photo, :confirm => "Really delete this photo?", :method => :delete if current_user.can_delete?(@photo)%>
(Бит current_user
поступает из плагина Restful-аутентификации.)
Автор также показывает, как обрабатывать случай, когда пользователь пытается ввести URL-адрес, для которого вы не дали ему ссылку. Он включает в себя настройку специального класса исключений, который подклассов StandardError
, и обработку его с помощью чего-то вроде 401.html
- доступ запрещен.
Глупая часть
То, что я сделал, было глупо: Я слепо следовал его примеру. Он показывает это:
def rescue_action(e)
case e
when SecurityTransgression
head :forbidden
end
end
... который обрабатывает SecurityTransgression
штраф, но нарушает обработку ошибок по умолчанию в Rails . (Я уверен, что автор знает это и имел дело с этим, но он не обсуждал это.)
Решение
Решением было добавить две строки:
def rescue_action(e)
case e
when SecurityTransgression
head :forbidden
else
super
end
end
Часть "else super" говорит: "Если я ничего не указал здесь, пусть унаследованный метод rescue_action
справится с этим."
Теперь я получаю правильную трассировку стека для моей исходной проблемы и продолжу ее устранять.
Урок: будьте осторожны, когда возитесь с обработкой исключений, и убедитесь, что регистр по умолчанию все еще работает!