2011-11-01 67 views
0

我想知道是否有一種方法可以根據模型實例狀態和使用它的控制器以不同方式表示模型(或者可能控制字段級別的訪問)。控制器的不同模型實例表示形式

例子:

假設我們有一個Order模型product_idcountpricestatus領域。 status可以是以下之一::new,:confirmed,:accepted,:cancelled,:delivered:closed

應用程序可以從例如兩個控制器CustomerOrdersControllerSellerOrdersController訪問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瞭解他們只定義的轉換,而不是方法集(即表示)目的。

回答

0

看起來像我已經找到合適的解決方案:在瑞安貝茨的截屏Dynamic attr_accessible

更新:
在Rails 3.1 update_attributes(params[:order], role)都可以使用。退房rails api。雖然它不能用於根據對象狀態更改訪問控制。

0

這聽起來像是簡單的訪問控制。根據授權用戶授予訪問權限,而不是使用哪個控制器。看一下cancan gem,爲您的AR對象實現乾淨的聲明式訪問控制。

+0

我已經在使用CanCan,但它僅限制訪問控制器操作級別。我需要隱藏更改特定AR對象的特定屬性的能力。例如。 'order = Order.first(1).wrap(CustomerOrdersController); order.price = 1#這會引發NoMethodError或類似這樣的事情 –

相關問題