2012-01-09 3 views
1

RESTful json 컨트롤러로 구성된 레일즈 3 백엔드를 만들었습니다. 예 : 제어기는 다음과 같이 보입니다 :상황에 맞는 JSON 응답

respond_to :json 

def index 
    ... 
    respond_with resources 
end 

... 

이것은 클라이언트에서 jQuery가 소비합니다. 모든 것이 훌륭하게 작동합니다.

내 다음 단계는 컨텍스트에 따라 일부 속성이 직렬화되지 않도록 JSON을 제어하는 ​​것입니다. 예 : 리소스의 소유자는 읽기 권한 만 가진 사람보다 더 많은 속성을 보냈습니다.

저는 현재 Draper으로 돌보고 있으며 사용자 역할에 따라 각 모델마다 별도의 데코레이터를 사용하고 있습니다.

제 문제는 이것이 많은 상용구를 생성하고 있다는 것입니다. 또한 현재 역할 기반 인증을 위해 cancan을 사용하고 있습니다.

누구든지이 작업을 수행하는 더 좋은 방법을 제안 할 수 있습니까?

답변

1

ActiveModel :: Serializer를 사용하는 것이 좋습니다. https://github.com/josevalim/active_model_serializers

노출하려는 각 리소스에 대한 serializer를 만듭니다. 그런 다음 각 모델에 대한 직렬화 논리를 분리하고 다른 방법을 쉽게 노출하며 역할에 따라 각 모델의 범위를 지정할 수 있습니다. CanCan과 잘 작동합니다.

나는 예를 들어, 다음 구문을 좋아한다 : 당신은 역에 사용하는 일이

class MonkeySerializer < ActiveModel::Serializer 
    attributes :name, :mom, :weight 

    private 

    # use this for a custom attribute not on the model 
    def weight 
    monkey.weight_in_pounds 
    end  
end 
+0

있습니까? 예 : 클라이언트에서 역 직렬화? – ghempton

+0

request_hash = ActiveSupport :: JSON.decode (request.body) – tee

+0

참조 http://stackoverflow.com/questions/1826727/how-do-i-parse-json-with-ruby-on-rails – tee