2009-03-03 4 views
18

JSON을 통해 모든 기사의 색인을 렌더링하고 싶습니다.Ruby on Rails 고급 JSON 직렬화

@index = Article.find(:all, :select => 'id, title') 

나 '유일한 방법 : 내가 응답 할 싶은 무엇

if params[:id] 
    @article = Article.find(params[:id]) 
else 
    @article = Article.published.not_draft.by_recent.first 
end 

respond_to do |format| 

format.js { render :json => @article.to_json(
:except => [ :created_at, :updated_at, :draft, :id, :publish ], 
:include => { 
    :comments => { 
     :only => [:body] 
    } 
}), 
:callback => params[:callback]} 
end 

지금처럼 모든 기사의 인덱스를 추가 할 수 있습니다 : 여기

지금 내 컨트롤러 인덱스와 기사를 해시 또는 배열에 넣은 다음이를 JSON에 저장합니다. 모두

@response = { :item => @article, :index => @index } 

전체 코드 : 지금은 :include 또는 :except을 지정하고 제대로 렌더링 얻을 수 없습니다 제외

@index = Article.find(:all, :select => 'id, title') 

if params[:id] 
    @article = Article.find(params[:id]) 
else 
    @article = Article.published.not_draft.by_recent.first 
end 

@response = { :item => @article, :index => @index } 

respond_to do |format| 

format.js { render :json => @response.to_json(), :callback => params[:callback]} 

end 

이것은, 잘 될 것입니다.

답변

1

은 당신과 같이 등 중첩 :include, :except에 할 수 있어야한다 : 문제가 해결되지 않으면

:except => {:item => [ :created_at, :updated_at, :draft, :id, :publish ]}... 

가 대신 해시의 그것은 물체 (예를 들어, OpenStruct)합니다.

- 마르쿠스

2

그냥 코드가 위의 작동 명확합니다 : 포함 : 제외. 그리고 작품을 보면 오류가 발생하지 않는다는 의미입니다. 문제는 색인의 모든 기사에 대한 주석을 포함한다는 것입니다. 색인에 나열된 기사가 아닌 항목에 대한 설명 만 포함하려고합니다.

중첩이 해시 또는 OpenStruct 개체로 작동하지 못했습니다.

중첩 : include는 오류를 던집니다. except는 오류를 발생시키지 않지만 아무것도 필터링하지 않으며, created_at 등은 여전히 ​​표시됩니다.

... 

@response = { :item => @article, :index => @index } 

format.js { render :json => @response.to_json(
:except => {:item => [ :created_at, :updated_at, :draft, :id, :publish ]}, 
:include => { :item => { 
     :comments => { 
       :only => [:body] 
     } 
}}), 
:callback => params[:callback]} 
end 
1

to_json이있다 : 당신의 이름을 어떤 방법의 결과를 포함하는 방법 옵션을, 당신은 당신의 JSON에서 원하는 추가 데이터를 반환하는 모델 방법을 정의 할 수 있습니다.

28

귀하의 질문에 대한 해결책을 알려주십시오. JSON으로 렌더링하기 위해 해시를 작성하려고 할 가능성이 큽니다. 이제는 as_json 메소드의 구현을 제공하는 것이 좋습니다. as_json은 인코딩하려는 데이터가 포함 된 해시를 작성하여 to_json 출력을 사용자 정의하는 공식적인 방법을 제공합니다.

Jonathan Julian's weblog에서 as_json과 to_json이 상호 작용하는 방식에 대한보다 철저한 처리가 있습니다.

1

(동의하시기 바랍니다 답변)

나는 nirvdrum가 준 링크가 답변을 보유하고 있다고 생각합니다. 아무도 encode_json을 언급하지 않았기 때문에 나는 대답한다.

귀하의 경우에는 as_json 만 처리해야합니다.해시를 만들고 (as_json로 다양한 호출을 통해) render :json => ... (to_json 호출없이)을 보내거나 모델에 as_json을 구현하고 레일즈가 모든 작업을 수행하도록하십시오. (하지만 전 필요하다고 의심됩니다.)

렌더링 된 응답에 멋진 js가 필요한 경우 encode_json을 클래스에 구현할 수 있습니다 (다시는 to_json이 아님). 예를 들어 :

class JsEmptyClosure 
    def encode_json(*args) 
    "jQuery[\"noop\"] || function(){}" 
    end 
    def as_json(*args) self end 
end 

이 이제 유효 JS와 to_json에 응답 (하지만 JSON 사실이 아니다주의)됩니다.

0

질문 주셔서 감사합니다. 몇 가지 연관이있는 모델에 대해 json 형식을 사용자 정의 할 수 있습니다.

하는 JSON 렌더링 = 제외> [: created_at : updated_at : USER_ID]

: posts.to_json (

@ 포함 => {

: 사용 => {: 전용 => [: 이메일, 전화]},

: 위치 => {: 전용 => : 제목, : lat, : lon, : 거리, : 도시, : 상태, : 우편 번호] },

,210

: 업로드 => I 자동 to_json 출력에 사용되는 것이다 alternat 해시를 반환하는 애트리뷰트 방법 과부하 추천 할

0

{: 만 => [이미지]}

}
) .

class Article 
    def attributes 
    { ... } # define your hash that you want to return at the '...' 
    end 
end 

내게는 to_json을 직접 사용하는 것보다 훨씬 간단합니다.