[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.당신이하면 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.당신은 대체 serializable_hash 대신 as_json, 레일 3에서이 문제가 발생하는 경우. 이 역시 무료로 포맷하여 XML을 얻을 것이다 :
당신은 대체 serializable_hash 대신 as_json, 레일 3에서이 문제가 발생하는 경우. 이 역시 무료로 포맷하여 XML을 얻을 것이다 :
이것은 알아 내기 위해 영원히 걸렸다. 누군가가 도움이되기를 바랍니다.
-
==============================
3.사용자 옵션을 무시할뿐만 아니라 자신의를 추가하고 싶지 않은 사람들을 위해 :
사용자 옵션을 무시할뿐만 아니라 자신의를 추가하고 싶지 않은 사람들을 위해 :
def as_json(options) # this example DOES NOT ignore the user's options super({:only => [:email, :handle]}.merge(options)) end
이 사람을 도움이되기를 바랍니다 :)
-
==============================
4.하지 to_json하지만 as_json를 재정의합니다. 그리고 as_json 통화에서 당신이 원하는 :
하지 to_json하지만 as_json를 재정의합니다. 그리고 as_json 통화에서 당신이 원하는 :
이 시도:
def as_json { :username => username, :foo => foo, :bar => bar } end
from https://stackoverflow.com/questions/2572284/how-to-override-to-json-in-rails by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 형태로 여러 개체 (0) | 2020.02.04 |
---|---|
[RUBY-ON-RAILS] 레일 redirect_to의 매개 변수 전달 (0) | 2020.02.04 |
[RUBY-ON-RAILS] 3 레일 - PG 보석을 설치할 수 없습니다 (0) | 2020.02.04 |
[RUBY-ON-RAILS] 어떻게 액티브 / 레일과 NOT IN 쿼리를 표현하는? (0) | 2020.02.04 |
[RUBY-ON-RAILS] 열망로드 다형성 (0) | 2020.02.04 |