【发布时间】:2010-10-18 04:38:10
【问题描述】:
我正在将代码从构建在非标准自定义 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
由于模型本身(理论上)不知道进行更改的用户,那么做这种事情的“rails 方式”是什么?我应该将活动用户设置为记录上的虚拟属性(实际上并未保存到数据库),还是应该只在控制器中执行这些检查?我不得不承认,让活动用户的模型检查权限确实感觉很奇怪,并且在测试模型时增加了复杂性。
我热衷于在模型中保留尽可能多的内容的一个原因是,我想同时提供 API(通过 OAuth 访问)和网站,而不需要复制太多代码,例如这些类型权限检查。
【问题讨论】:
标签: ruby-on-rails validation activerecord permissions ruby-on-rails-3