Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 控制器的不同模型实例表示_Ruby On Rails_Ruby_Model_Controller - Fatal编程技术网

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.1
update_属性(params[:order],role)
中可以使用。退房虽然它不能用于根据对象的状态更改访问控制。

我已经在使用CanCan,但它只是在控制器操作级别上限制访问。我需要隐藏更改特定AR对象的特定属性的能力。例如,
order=order.first(1).wrap(CustomerOrdersController);order.price=1#这将引起NoMethodError或类似的问题