2010-08-26 9 views
7

Mam pewne dane w Railsach, które chcę renderować jako dane JSON. To, co teraz robię, to po prostu znajdowanie wszystkich wystąpień modelu i wywoływanie renderowania: json => data.Szyny renderujące dane JSON z modelem Root

data = Data.find(:all) 
render :json => data 

Jednak szyny zawierają nazwę modelu w każdym obiekcie JSON. Więc moje dane JSON kończy się wyglądać jak ten:

[{modelname:{propertyName: 'value',...}},{modelname:{propertyName: 'value2',...}}] 

zamiast tego: [{propertyName: 'wartość', ...}, {propertyName: 'wartość2', ...}]

Nazwa modelu jest zawsze taka sama i nie chcę, aby tam była.

Zmieniono opcję renderowania katalogu głównego w danych JSON w jednym z inicjalizatorów Rails, ale ma to wpływ na wszystko, co chcę renderować jako JSON, czego nie chcę robić dla tego projektu.

W tym przypadku chcę móc to zrobić indywidualnie dla każdego przypadku.

Jak mogę to zrobić? Z góry dziękuję.

Odpowiedz

2

Nie znalazłem sposobu, aby to zrobić, przekazując opcje do metody to_json (i nie sądzę, że istnieje taka opcja). Masz więcej możliwości, aby to zrobić, każda klasa dziedzicząca po ActiveRecord :: Base będzie miała parametr include_root_in_json.

Zrób coś takiego.

Data.include_root_in_json = false 
data = Data.find(:all) 
render :json => data 

Mam nadzieję, że to ci idzie.

OK, spróbujmy tego.

DataController < ApplicationControlle 

    private 

    def custom_json(data) 
    Data.include_root_in_json = false 
    data.to_json 
    Data.include_root_in_json = true 
    data 
    end 
end 

Wtedy twój przekierowanie będzie wyglądać następująco

data = Data.find(:all) 
render :json => custom_json(data) 

jest to dość głupie kod Chciałabym myśleć o czymś zupełnie innym. Pozwól, że Cię zapytam: co to jest, jeśli nazwa modelu zawiera się w danych json?

+0

Po prostu próbowałem tego, i ma niestety wpływ na zmianę parametru include_root_in_json na false globalnie. Używam Railsów 2.3.5, jeśli to pomaga. – CCSab

1

Z Rails 3, znalazłem tę drogę lepiej zrobić. Przesłonić as_json w modelu i wykonaj następujące czynności:

def as_json(options = {}) 
    super(options.merge :methods => [:some_method_that_you_want_to_include_result], :include => {:child_relation => {:include => :grand_child_relation } }) 
end 
12

Z szyn 3, można użyć active_model_serializers gem 1

który pozwala określić rootless rendering obiektu takiego:

render :json => data, :root => false 
+0

To zadziałało dla mnie, chociaż ten okres prawdopodobnie powinien być przecinkiem? – stickwithjosh

+1

Dziękuję, odpowiedź edytowana, aby mieć przecinek –