我想知道是否有一種方法可以根據模型實例狀態和使用它的控制器以不同方式表示模型(或者可能控制字段級別的訪問)。控制器的不同模型實例表示形式
例子:
假設我們有一個Order
模型product_id
,count
,price
和status
領域。 status
可以是以下之一::new
,:confirmed
,:accepted
,:cancelled
,:delivered
和:closed
。
應用程序可以從例如兩個控制器CustomerOrdersController
和SellerOrdersController
訪問Order
。所以,CustomerOrdersController
可以創建和編輯訂單。但只能更改count
字段。另一方面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
另一種方法是做頓的檢查和內部控制措施params
驗證,但我不想。我相信,在「發模型 - 瘦控制器」 :)
PPS
我知道紅寶石有充足的狀態機插件,但AFAI瞭解他們只定義的轉換,而不是方法集(即表示)目的。
我已經在使用CanCan,但它僅限制訪問控制器操作級別。我需要隱藏更改特定AR對象的特定屬性的能力。例如。 'order = Order.first(1).wrap(CustomerOrdersController); order.price = 1#這會引發NoMethodError或類似這樣的事情 –