我正在将内置于非标准定制
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
由于模型本身(理论上)不知道正在做出改变的用户,所以做这种事情的“轨道”是什么?我应该将活动用户设置为记录上的虚拟属性(实际上不保存到DB),还是应该在控制器中执行这些检查?我不得不承认,模型检查活动用户的权限感到奇怪,并且在测试模型时增加了复杂性.
我渴望在模型中保持尽可能多的一个原因是因为我想提供一个API(通过OAuth访问)和一个网站,而不会重复太多的代码,例如这些类型的权限检查.