2011-01-22 3 views
0

모델을 JSON으로 렌더링 할 때 포함시키고 자하는 가상 속성이있는 모델이 있습니다. 나는이 일을했습니다to_json options [: methods]가 Model.all에서 작동하지 않습니다.

속성의 목록에 내 date_string 방법을 추가
def to_json(options={}) 
    options[:methods] ||= []; 
    options[:methods] << :date_string; 
    super(options); 
end 

가 JSON을 생성 할 때 렌더링 할 수 있습니다.

def show 
    @project = Project.find params[:id] 
    respond_to do |format| 
     format.html 
     format.json { render :json => @project } 
    end 
    end 

하지만 인덱스 작업이 date_string 포함되지 않습니다 :

def index 
    @projects = Project.all 
    respond_to do |format| 
     format.html 
     format.json { render :json => @projects } 
    end 
    end 
을 내 컨트롤러에서

는 show 액션은 그냥 보통의 속성 인 것처럼 date_string 렌더링, 올바른 결과를 생성

이 작업을 수행 할 수 있는지 누가 알 수 있습니까? 컬렉션을 렌더링 할 때 특정 모델 to_json을 사용하지 않는 것으로 추측됩니다.


편집 : 어쩌면 지금 as_json를 사용해야 것 같은데 - 그이 해결되는지 내가 볼 수 있습니다.

편집 2 : 나는 as_json이 여기에 어떤 차이가 있다고 생각하지 않습니다. 이 모든 직렬화 형식 (즉, JSON 및 XML)에 추가됩니다

def serializable_hash(options) 
    super(options.deepmerge({:methods => :date_string})) 
end 

참고 : 가상 필드를 포함하는 serializable_hash 메소드를 오버라이드 (override) 할 수처럼

답변

1

as_json이 작동해야합니다. to_json은이 값을 json으로 변환하고이를 인코딩합니다. as_json은 인코딩없이 변환을 수행합니다. 배열은 인코딩없이 객체를 변환하고 배열을 직렬화 때 불려 가도록 모델의 as_json() 메소드 그래서 다음 한 번에 전체 문자열을 인코딩 :

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/json/encoding.rb#L215

내가 로컬 문제를 재현 할 수 있었다

및 이 솔루션은 나를 위해 일했습니다 :

def as_json(options={}) 
    options ||= {} # need this because to_json without options will pass nil to as_json 
    options[:methods] ||= []; 
    options[:methods] << :date_string; 
    super(options); 
end 
+0

감사합니다. 나는 전에'as_json'을 시도했지만,'options || = {}'줄을 사용하지 않았습니다 - 그것은 나를 위해 정렬했습니다. 건배 :) – Skilldrick

2

ActiveModel::Serialization docs 보면, 그것은 보인다.

그래도 해결되지 않으면 일부 로깅을 추가하여 메서드가 컬렉션 케이스에서 호출되는지 확인하십시오.

+0

감사합니다 - 너무 유용합니다. 언제든지 XML로 직렬화해야한다면 또 다른 모습을 보일 것입니다. – Skilldrick

관련 문제