as_json이 어소시에이션으로 as_json을 호출하지 않음
저는 json으로 렌더링할 때 절대 포함해서는 안 되는 데이터를 가진 모델을 가지고 있습니다.그래서 적절하게 동작하기 위해 클래스의 as_json 메서드를 구현했습니다.문제는 이 모델과 관련된 다른 모델이 json을 렌더링할 때 내 커스텀 as_json이 호출되지 않는다는 것입니다.
class Owner < ActiveRecord::Base
has_one :dog
def as_json(options={})
puts "Owner::as_json"
super(options)
end
end
class Dog < ActiveRecord::Base
belongs_to :owner
def as_json(options={})
puts "Dog::as_json"
options[:except] = :secret
super(options)
end
end
개발 환경 로드(레일 3.0.3)
ruby-1.9.2-p4 : 001 > d = Dog.first
=>#<Dog id: 1, owner_id: 1, name: "Scooby", secret: "I enjoy crapping everwhere">
ruby-1.9.2-p12002 > d.as_json
개::as_json
=> {"dog"=> {"id"=> 1, "name"=> "스쿠비", "owner_id"=>1}
ruby-1.9.2-pvs : 004 > d.owner.as _ json ( : dog )
소유자: as_json
=> {" owner"=> {"id"=> 1, "name"=> "Shaggy", : dog=> {"id"=> 1, "name"=> "Scooby", "owner_id"=> 1, "secret"=> "어디서나 crappy"}}
도와 주셔서 감사해요.
이것은 Rails에서 이미 알려진 버그입니다.(이 문제는 이전 버그 트래커에서 Github 문제로 이행했기 때문에 종료되어 있습니다만, Rails 3.1에서는 아직 문제가 발생하고 있습니다.
위에서 인지한 바와 같이 이것은 레일즈 베이스의 문제입니다.여기 있는 레일 패치는 아직 적용되어 있지 않고 약간 논란이 있는 것 같기 때문에 현지 적용은 망설여집니다.원숭이 패치로 적용하더라도 향후 레일 업그레이드가 복잡해질 수 있습니다.
위에 제시된 RABL을 검토 중입니다. 유용할 것 같습니다.지금은 다른 뷰 템플릿 언어를 앱에 추가하고 싶지 않습니다.현재 저의 요구는 매우 적습니다.
여기에서는 패치가 필요하지 않고 대부분의 간단한 경우에 사용할 수 있는 회피책이 있습니다.이건 협회에서 일하는 곳이야as_json호출하고 싶은 메서드는 다음과 같습니다.
def as_json(options={})
super( <... custom options ...> )
end
저 같은 경우에는Schedule많은 모델을 가지고 있는 모델Events
class Event < ActiveRecord::Base
# define json options as constant, or you could return them from a method
EVENT_JSON_OPTS = { :include => { :locations => { :only => [:id], :methods => [:name] } } }
def as_json(options={})
super(EVENT_JSON_OPTS)
end
end
class Schedule < ActiveRecord::Base
has_many :events
def as_json(options={})
super(:include => { :events => { Event::EVENT_JSON_OPTS } })
end
end
가이드라인에 따라 언제든지:include의 연관성as_json()방법: 필요한 옵션을 모형에 상수로 정의하면 임의 수준의 연관성에 사용할 수 있습니다.주의: 위의 예에서 커스터마이즈된 첫 번째 수준의 연관성만 있으면 됩니다.
serializable_hash는 as_json과 동일하게 동작하며 항상 다음과 같이 불립니다.
def serializable_hash(options = {})
result = super(options)
result[:url] = "http://.."
result
end
저도 같은 문제에 부딪혔어요.난 이게 효과가 있기를 바랐어.
render :json => @favorites.as_json(:include => :location)
그러나 그렇지 않았기 때문에 다음과 같은 index.json.erb를 추가하게 되었습니다.
<% favs = @favorites.as_json.each do |fav| %>
<% fav["location"] = Location.find(fav["location_id"]).as_json %>
<% end %>
<%= favs.to_json.html_safe %>
수정은 아닙니다. 그냥 회피하는 것입니다.너도 그랬을 거야
업데이트 @John은 이것이 Rails에서 알려진 버그라고 지적했습니다.이 패치를 수정하기 위한 패치는 https://github.com/rails/rails/pull/2200에서 확인할 수 있습니다.그래도 RABL을 시도해보세요.달콤하니까.
나는 내가 원하는 JSON 뷰를 만들기 위한 복잡한 옵션 세트를 전달하는 것에 항상 좌절해 왔다.Rails 3.0.9의 Mongoid에서 겪었던 당신의 문제로 인해 JSON 템플릿을 작성하게 되었습니다.그러나 실제로 관계나 커스텀 API 속성을 다루고 있다면 템플릿이 훨씬 좋은 것으로 나타났습니다.
또, 다른 출력에 대응하는 것은 View 레이어라고 생각되기 때문에, API 템플릿 언어인 RABL을 사용하기로 했습니다.이를 통해 유효한 JSON을 쉽게 구축하고 모든 연관성 또는 필드를 포함할 수 있습니다.
문제에 대한 해결책이 아니라 사용 사례에 대한 더 나은 해결책입니다.
이는 버그로 보고되었습니다.http://ternarylabs.com/2010/09/07/migrating-to-rails-3-0-gotchas-as_json-bug/
언급URL : https://stackoverflow.com/questions/4840968/as-json-not-calling-as-json-on-associations
'programing' 카테고리의 다른 글
| JSON 파일에서 TAB을 구문 분석할 수 없습니다. (0) | 2023.03.08 |
|---|---|
| Angularjs가 트랜스코프 및 바인딩을 분리하여 혼란스러워함 (0) | 2023.03.08 |
| AngularJs에서 ng-Cloak 지시어를 실제로 사용하는 방법은 무엇입니까? (0) | 2023.03.08 |
| Spring MVC 및 부트를 통한 정적 콘텐츠 갱신 (0) | 2023.03.08 |
| 스프링 부트 및 gRPC 및 Protobuf 사용 (0) | 2023.03.08 |