복붙노트

[RUBY-ON-RAILS] 어떻게 레일에 to_json 오버라이드 (override)?

RUBY-ON-RAILS

어떻게 레일에 to_json 오버라이드 (override)?

이 문제는 제대로 탐구되지 않았습니다. 내 진짜 문제 거짓말 렌더링 : JSON을.

원래의 질문의 첫 번째 코드 페이스트는 예상 된 결과를 얻을 것입니다. 그러나, 여전히주의가있다. 이 예제를 참조하십시오 :

렌더링 : JSON => CURRENT_USER

NOT과 동일

렌더링 : JSON => current_user.to_json

즉, 렌더링 : JSON은 자동으로 사용자 개체와 관련된 to_json 메서드를 호출하지 않습니다. to_json이 사용자 모델에 무시되는 경우 사실, 렌더링 다음 오류 ArgumentError를 생성합니다 JSON => @user 아래에 설명.

# works if User#to_json is not overridden
render :json => current_user

# If User#to_json is overridden, User requires explicit call
render :json => current_user.to_json

이 모두가 나에게 바보 같다. JSON 지정 :이 유형의 경우 실제로 모델 번호의 to_json을 호출되지 않은 렌더링이 나에게 말하고있는 것 같다. 누군가가 정말 여기에서 무슨 일이 일어나고 있는지 설명 할 수 있습니까?

이 좀 도와 수있는 모든 제 나이 가능성이 내 다른 질문에 대답 할 수 있습니다 레일에 foo.to_json @ (옵션)와 @ bars.to_json (옵션) 결합하여 JSON 응답을 구축하는 방법

나는 SO에 대한 몇 가지 다른 예를 본 적이 있지만 나는 아무도 내가 무엇을 찾고하지 않는다.

노력하고있어:

class User < ActiveRecord::Base

  # this actually works! (see update summary above)
  def to_json
    super(:only => :username, :methods => [:foo, :bar])
  end

end

내가하면 ArgumentError 받고 있어요 : 인수의 잘못된 번호 (0 1)에서을

/usr/lib/ruby/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/json/encoders/object.rb:4:in `to_json

어떤 아이디어?

해결법

  1. ==============================

    1.당신이하면 ArgumentError을 얻고있다 : 인수의 잘못된 번호 (1 0) to_json의 요구는 하나 개의 매개 변수, 옵션 해시 오버라이드 (override) 할 수 있기 때문이다.

    당신이하면 ArgumentError을 얻고있다 : 인수의 잘못된 번호 (1 0) to_json의 요구는 하나 개의 매개 변수, 옵션 해시 오버라이드 (override) 할 수 있기 때문이다.

    def to_json(options)
      ...
    end
    

    to_json, as_json 및 렌더링의 긴 설명 :

    ActiveSupport 2.3.3에서 as_json 당신이 발견 한 것과 같은 주소 문제에 추가되었습니다. json으로의 생성은 JSON의 렌더링으로부터 분리되어야한다.

    이제 언제든지 to_json이 객체에서 호출, as_json는 데이터 구조를 만들기 위해 호출 한 다음 해당 해시 ActiveSupport :: json.encode를 사용하여 JSON 문자열로 인코딩됩니다. 이것은 모든 유형의 발생 : 개체, 숫자, 날짜, 문자열 등을합니다 (ActiveSupport 코드 참조).

    액티브는 같은 방식으로 동작합니다 객체. 모든 모델의 속성을 포함하는 해시를 생성하는 기본 as_json 구현이있다. 당신은 당신이 원하는 JSON 구조를 만들려면 모델에 as_json를 오버라이드 (override) 할 필요가 있습니다. as_json, 그냥 오래된 to_json처럼, 당신은 선언적으로 포함하는 속성과 메소드를 지정할 수있는 옵션 해시를합니다.

    def as_json(options)
      # this example ignores the user's options
      super(:only => [:email, :handle])
    end
    

    컨트롤러에서 렌더링 : JSON 문자열 또는 객체를 받아 들일 수 있습니다> O =. 이 객체의 경우 문자열의 경우는 응답 본문으로 통과 한 것, to_json은 위에 설명 된 바와 같이 as_json하는 트리거라고합니다.

    그래서, 한 당신의 모델이 제대로 (안 나) as_json 재로 표현 될 때, 하나 개의 모델을 표시하는 컨트롤러 코드는 다음과 같이한다 :

    format.json { render :json => @user }
    

    이야기의 교훈은 다음과 피가 당신을 위해 그렇게 렌더링, 직접 to_json을 허용 호출. 당신은 JSON 출력, 전화 as_json을 조정할 필요가 있다면.

    format.json { render :json => 
        @user.as_json(:only => [:username], :methods => [:avatar]) }
    
  2. ==============================

    2.당신은 대체 serializable_hash 대신 as_json, 레일 3에서이 문제가 발생하는 경우. 이 역시 무료로 포맷하여 XML을 얻을 것이다 :

    당신은 대체 serializable_hash 대신 as_json, 레일 3에서이 문제가 발생하는 경우. 이 역시 무료로 포맷하여 XML을 얻을 것이다 :

    이것은 알아 내기 위해 영원히 걸렸다. 누군가가 도움이되기를 바랍니다.

  3. ==============================

    3.사용자 옵션을 무시할뿐만 아니라 자신의를 추가하고 싶지 않은 사람들을 위해 :

    사용자 옵션을 무시할뿐만 아니라 자신의를 추가하고 싶지 않은 사람들을 위해 :

    def as_json(options)
      # this example DOES NOT ignore the user's options
      super({:only => [:email, :handle]}.merge(options))
    end
    

    이 사람을 도움이되기를 바랍니다 :)

  4. ==============================

    4.하지 to_json하지만 as_json를 재정의합니다. 그리고 as_json 통화에서 당신이 원하는 :

    하지 to_json하지만 as_json를 재정의합니다. 그리고 as_json 통화에서 당신이 원하는 :

    이 시도:

    def as_json 
     { :username => username, :foo => foo, :bar => bar }
    end
    
  5. from https://stackoverflow.com/questions/2572284/how-to-override-to-json-in-rails by cc-by-sa and MIT license