2011-11-01 2 views
0

나는 (모델 인스턴스) 상태와 그것을 사용하는 컨트롤러에 따라 모델을 다르게 표현하거나 (아마도 필드 레벨에서 액세스를 제어하는) 방법이 있는지 궁금합니다.컨트롤러에 대한 다른 모델 인스턴스 표현

예 :

우리가 product_id, count, pricestatus 필드가있는 Order 모델을 가지고 상상해보십시오. status:new, :confirmed, :accepted, :cancelled, :delivered:closed 중 하나 일 수 있습니다.

응용 프로그램은 예를 들어 두 개의 컨트롤러 CustomerOrdersControllerSellerOrdersController에서 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들은의 전환이 아닌 방법 세트 (즉, 표현)를 정의 이해 - 나는 "마른 컨트롤러 뚱뚱한 모델"을 믿는다 목적.

답변

0

이 보이는 라이언 베이츠의 스크린 캐스트에 Dynamic attr_accessible

업데이트 : 3.1 update_attributes(params[:order], role)이 레일에서
을 사용할 수있다. rails api을 확인하십시오. 객체의 상태에 따라 액세스 제어를 변경하는 데는 사용할 수 없지만

0

간단한 액세스 제어처럼 들립니다. 권한이 부여 된 사용자를 기준으로 액세스 권한이 부여되고 컨트롤러는 사용되지 않습니다. AR 객체에 대한 깨끗한 선언적 액세스 제어 구현을위한 cancan 보석을 살펴보십시오. 내가 적절한 해결책을 찾을 것 같은

+0

CanCan을 이미 사용하고 있지만 컨트롤러 동작 수준에서만 액세스를 제한합니다. 특정 AR 개체의 특정 특성을 변경하는 기능을 숨길 필요가 있습니다. 예 : 'order = Order.first (1) .wrap (CustomerOrdersController); order.price = 1 # NoMethodError 또는 이와 비슷한 것을 발생시킵니다 .' –

관련 문제