我想知道有没有办法以不同的方式表示模型(或者可能控制字段级别的访问),具体取决于它的(模型实例)状态和使用它的控制器。
示例:
想象一下,我们的Order
模型包含product_id
,count
,price
和status
字段。
status
可以是::new
,:confirmed
,:accepted
,:cancelled
,:delivered
和:closed
之一。
应用可以从两个控制器Order
和CustomerOrdersController
访问SellerOrdersController
。因此,CustomerOrdersController
可以创建和编辑订单。但是只能更改count
字段。另一方面,SellerOrdersController
可以编辑订单。但只能改变价格领域。即如果Order
类CustomerOrdersController
类的实例没有price=
方法,那就太棒了。 count=
(product=
)和SellerOrderController
相同。
允许编辑的更多列集取决于状态字段(可能适用于某些状态机)。
所以,问题是:你会在你的应用中如何做到这一点?
PS
我考虑ActiveModel
个实例的一些ActiveRecord
代理对象,但实际上不知道它是否有效。考虑:
class CustomerOrderProxy < ActiveModel::Base end
class SellerOrderProxy < ActiveModel::Base end
class Order < ActiveRecord::Base
def wrap_proxy(controller_user)
controller_user == CustomerOrdersController ? CustomerOrderProxy(self) : SellerOrderProxy(self)
end
end
另一种方法是在控制器操作中进行大量检查和params
验证,但我不想这样做。我相信“胖模特 - 瘦小的控制者”:)
PPS
我知道ruby有很多状态机插件,但AFAI明白它们只定义了转换,而不是对象的方法设置(即表示)。
答案 0 :(得分:0)
这听起来像简单的访问控制。基于授权用户授予访问权限,而不是使用哪个控制器。看一下cancan gem,为AR对象实现干净的声明式访问控制。
答案 1 :(得分:0)
看起来我找到了合适的解决方案:在Ryan Bates的截屏视频Dynamic attr_accessible
更新:
在Rails 3.1中可以使用update_attributes(params[:order], role)
。查看rails api。虽然它不能用于根据对象的状态更改访问控制。