Ruby on rails 控制器的不同模型实例表示
我想知道是否有一种方法可以根据模型的(模型实例)状态和使用它的控制器来不同地表示模型(或者可能控制字段级别的访问) 示例: 假设我们有一个带有Ruby on rails 控制器的不同模型实例表示,ruby-on-rails,ruby,model,controller,Ruby On Rails,Ruby,Model,Controller,我想知道是否有一种方法可以根据模型的(模型实例)状态和使用它的控制器来不同地表示模型(或者可能控制字段级别的访问) 示例: 假设我们有一个带有产品id,计数,价格和状态字段的订单模型。 状态可以是以下状态之一::新建,:确认,:接受,:取消,:交付和:关闭 应用程序可以从两个控制器CustomerOrdersController和SellerOrdersController访问Order。因此,CustomerOrdersController可以创建和编辑订单。但只能更改计数字段。另一方面,Se
产品id
,计数
,价格
和状态
字段的订单
模型。
状态可以是以下状态之一::新建
,:确认
,:接受
,:取消
,:交付
和:关闭
应用程序可以从两个控制器CustomerOrdersController
和SellerOrdersController
访问Order
。因此,CustomerOrdersController
可以创建和编辑订单。但只能更改计数
字段。另一方面,SellerOrdersController
可以编辑订单。但只能更改价格字段。也就是说,如果使用CustomerOrdersController
的Order
类的实例没有price=
方法,那就太好了。对于count=
(product=
)和SellerOrderController
也一样
更多允许编辑的列集取决于状态字段(可能适用于某些状态机)
所以,问题是:你将如何在你的应用程序中做到这一点?
PS
我为ActiveRecord
实例考虑了一些ActiveModel
代理对象,但不知道它到底能不能工作。考虑:
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
class CustomerOrderProxy
另一种方法是在控制器操作中执行大量检查和params
验证,但我不想这样做。我相信“胖模特-瘦控制器”:
PPS
我知道ruby有很多状态机插件,但AFAI知道它们只定义转换,而不是对象的方法集(即表示)。这听起来像是简单的访问控制。访问权限是根据授权用户授予的,而不是使用哪个控制器。看看为AR对象实现干净、声明式访问控制的gem。看起来我已经找到了合适的解决方案:在Ryan Bates的屏幕广播中
更新:
在Rails3.1update_属性(params[:order],role)
中可以使用。退房虽然它不能用于根据对象的状态更改访问控制。我已经在使用CanCan,但它只是在控制器操作级别上限制访问。我需要隐藏更改特定AR对象的特定属性的能力。例如,order=order.first(1).wrap(CustomerOrdersController);order.price=1#这将引起NoMethodError或类似的问题