나는 (모델 인스턴스) 상태와 그것을 사용하는 컨트롤러에 따라 모델을 다르게 표현하거나 (아마도 필드 레벨에서 액세스를 제어하는) 방법이 있는지 궁금합니다.컨트롤러에 대한 다른 모델 인스턴스 표현
예 :
우리가 product_id
, count
, price
및 status
필드가있는 Order
모델을 가지고 상상해보십시오. status
은 :new
, :confirmed
, :accepted
, :cancelled
, :delivered
및 :closed
중 하나 일 수 있습니다.
응용 프로그램은 예를 들어 두 개의 컨트롤러 CustomerOrdersController
과 SellerOrdersController
에서 Order
에 액세스 할 수 있습니다. 따라서 CustomerOrdersController
은 주문을 생성하고 편집 할 수 있습니다. 그러나 count
필드 만 변경할 수 있습니다. 반면에 SellerOrdersController
은 주문을 편집 할 수 있습니다. 그러나 가격 필드 만 변경할 수 있습니다. 나는. Order
클래스의 인스턴스가 CustomerOrdersController
에있는 경우는 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 또는 이와 비슷한 것을 발생시킵니다 .' –