控制器的不同模型实例表示

时间:2011-11-01 09:24:20

标签: ruby-on-rails ruby model controller

我想知道有没有办法以不同的方式表示模型(或者可能控制字段级别的访问),具体取决于它的(模型实例)状态和使用它的控制器。

示例:

想象一下,我们的Order模型包含product_idcountpricestatus字段。 status可以是::new:confirmed:accepted:cancelled:delivered:closed之一。

应用可以从两个控制器OrderCustomerOrdersController访问SellerOrdersController。因此,CustomerOrdersController可以创建和编辑订单。但是只能更改count字段。另一方面,SellerOrdersController可以编辑订单。但只能改变价格领域。即如果OrderCustomerOrdersController类的实例没有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明白它们只定义了转换,而不是对象的方法设置(即表示)。

2 个答案:

答案 0 :(得分:0)

这听起来像简单的访问控制。基于授权用户授予访问权限,而不是使用哪个控制器。看一下cancan gem,为AR对象实现干净的声明式访问控制。

答案 1 :(得分:0)

看起来我找到了合适的解决方案:在Ryan Bates的截屏视频Dynamic attr_accessible

更新:
在Rails 3.1中可以使用update_attributes(params[:order], role)。查看rails api。虽然它不能用于根据对象的状态更改访问控制。