Я перевожу код из приложения, созданного в нестандартной пользовательской среде PHP, в Ruby on Rails (версия 3). В версии PHP все контроллеры действительно толстые, с тонкими моделями, с которыми я всегда не соглашался, поэтому мне нравится, как Rails выполняет валидацию на уровне модели, что, вероятно, составляет 90% того, что происходит в этих жирных контроллерах. в настоящее время.
Одна проблема, с которой я сталкиваюсь, и не знаю, как ее решить, однако, это проблема различных правил проверки, основанных на том, кто вносит изменения в модель. Например, администратор или первоначальный создатель записи должен иметь возможность пометить запись как удаленную (мягкое удаление), тогда как все остальные не должны.
class Something < ActiveRecord::Base
...
validates :deleted, :owned_by_active_user => true
...
end
class OwnedByActiveUserValidator < ActiveModel::EachValidator
validate_each(record, attr_name, attr_value)
# Bad idea to have the model know about things such as sessions?
unless active_user.admin? || active_user.own?(record)
record.errors.add :base, "You do not have permission to delete this record"
end
end
end
Поскольку сама модель (в теории) не знает о пользователе, который вносит изменения, каков "рельсовый путь" для такого рода вещей? Должен ли я установить активного пользователя как виртуальный атрибут в записи (фактически не сохраненный в БД), или я должен просто выполнить эти проверки в контроллере? Я должен признать, что странно, когда модель проверяет разрешения у активного пользователя, и это добавляет сложности, когда дело доходит до тестирования модели.
Одна из причин, по которым я стремлюсь сохранить как можно больше этого в модели, заключается в том, что я хочу предоставить как API (доступ через OAuth), так и веб-сайт, без дублирования слишком большого количества кода, такого как эти типы. проверок разрешений.