2012-05-30 3 views
4

콤보 박스를 빌드하는 자바 스크립트 라이브러리로 작업하고 있습니다. 나는 사람의 가득 차있는 이름를 가진 콤보 상자를 건설 할 필요가있다, 그래서 나는 이름 + 성을 의미한다.JSON 직렬화에 포함되어야하는 사용자 정의 모델 메소드

데이터베이스가 2 개의 개별 필드 (및 내 모델에서도)이기 때문에 추가 필드의 존재를 "시뮬레이트"하기 위해 빠른 방법 (모든 해시 객체를 수동으로 빌드하는 대신)이 있는지 알고 싶습니다. * full_name *을 키로 읽을 수있는 JSON 배열로이 객체를 반환해야하기 때문에 JSON 변환을위한 내 모델에서 도움을

덕분에

답변

8

당신은 :methods 옵션을 전달하여 모델의 to_json 방법을 덮어 쓸 수 있으며, super으로 전화하십시오. 이 경우 :methods 옵션을 사용하는 as_json 수퍼 클래스 버전이 호출되어 full_name 특성을 사용하여 모델을 serialize합니다. 컨트롤러 내부

class Person < ActiveRecord::Base 
    def as_json(options={}) 
    options[:methods] = [:full_name] 
    super 
    end 

    def full_name 
    "#{first_name} #{last_name}" 
    end 
end 

, 당신은 단순히

render :json => @person 

확인 당신이 원하는 있는지이 문서가 as_json 방법에 전달할 수있는 더 많은 옵션을 알 수 있습니다. http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

+0

좋은 답변 친구, 좋은 예도 있습니다. 잠깐 시험 해봐도 정상적으로 돌아갈 것 같아. –

+0

맞으면 대답 해주세요. 고마워 :) – Chamnap

+0

Obviusly;) 당신의 대답은 정확하지만 물건을 언급하는 걸 깜빡했는데, 만약 내가 밴드 선택 소비를 피하기 위해 json conversion에서 몇몇 필드를 생략하고 싶다면 어떻게해야 할까? –

-1

당신이 할 수있는 일은 너무

def full_name=(string) 
    names = string.split # the default delimiter is a space 
    self.update_attributes(:first_name => names[0], :last_name => names[1]) 
end 

양식은 다음 필드로 :full_name를 참조해야처럼 사용자 클래스의 setter 메소드를 가지고 있으며, 그것은 아니더라도 실제 열을 입력하면 Rails가 자동으로 위의 메서드에 액세스하여이를 실행하므로 실제로 원하는 열을 업데이트합니다.

+0

죄송합니다. 이것은 내가 의미하는 바가 아니며, 반대가 필요합니다. full_name을 읽고 JSON 객체에 쓰고 json 객체를 레일즈 모델 객체로 변환하지 마십시오. –

1

이이 질문의 중복으로 나타납니다

Rails 3 respond_to json, with custom attributes/methods

구체적으로 : 방법 해시 :

respond_with({ 
    :cars => @cars.as_json(:only => [:make, :model], :methods => [:full_name]), 
    :vans => @vans 
}) 
+0

2 개의 대답을 병합 할 수는 없지만 유용합니다. Chamnap은 내 상황에 더 좋지만, json 변환에서 메소드를 "일시적"으로 포함하려는 상황에 도움이됩니다 (override가 아닌 옵션으로 전달되기 때문에). –

관련 문제