Załóżmy, że jesteś w kontrolerze użytkowników i chcesz uzyskać odpowiedź json na żądanie pokazu, byłoby miło, gdybyś mógł utworzyć plik w swoim katalogu views / users / dir o nazwie show.json i po # show użytkowników akcja jest zakończona, renderuje plik.
Obecnie musisz zrobić coś w stylu:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json{
render :json => @user.to_json
}
end
end
Ale byłoby miło, gdybyś mógł po prostu utworzyć plik show.json, który jest automatycznie renderowany w następujący sposób:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
Oszczędziłoby mi to mnóstwo smutku i zmyłoby to okropnie brudne uczucie, które odczuwam, gdy renderuję mój json w kontrolerze
format.json
zshow.json.erb
plikiem. Zobacz moją odpowiedź.Odpowiedzi:
W swoim
respond_to
bloku powinieneś być w stanie zrobić coś takiego :który wyrenderuje szablon w formacie
app/views/users/_show.json.erb
.źródło
Spróbuj dodać widok
users/show.json.erb
Powinno to zostać wyrenderowane kiedy żądasz formatu JSON i uzyskasz dodatkową korzyść z renderowania go również przez erb, więc Twój plik może wyglądać mniej więcej takźródło
@user.first_name.to_json
zamiastescape_javascript
. Istnieje kilka subtelnych różnic między tym, co pozwala JS, a tym, co jest ściśle JSON. (I te różnice stają się ważne, gdy przeglądarki implementują własne parsery JSON.)<%= xyz.to_json %>
przeciwnym razie zostaną ci dodatkowe cytaty.Jak wspominali inni, potrzebujesz widoku users / show.json, ale istnieją opcje do rozważenia w przypadku języka szablonów ...
ERB
Działa po wyjęciu z pudełka. Świetne dla HTML, ale szybko przekonasz się, że jest okropne dla JSON.
RABL
Dobre rozwiązanie. Musisz dodać zależność i nauczyć się jej DSL.
JSON Builder
Taka sama oferta jak RABL: Dobre rozwiązanie. Muszę dodać zależność i nauczyć się jej DSL.
Zwykły rubin
Ruby jest niesamowity w generowaniu JSON i nie ma nic nowego do nauczenia się, ponieważ możesz wywołać
to_json
obiekt Hash lub AR. Po prostu zarejestruj rozszerzenie .rb dla szablonów (w inicjatorze):Następnie utwórz widok users / show.json.rb:
Więcej informacji na temat tego podejścia można znaleźć pod adresem http://railscasts.com/episodes/379-template-handlers
źródło
RABL jest prawdopodobnie najładniejszym rozwiązaniem tego problemu, jakie widziałem, jeśli szukasz czystszej alternatywy dla składni ERb. json_builder i argonaut, które są innymi rozwiązaniami, wydają się nieco przestarzałe i nie będą działać z Railsami 3.1 bez poprawek.
RABL jest dostępny za pośrednictwem perełki lub sprawdź repozytorium GitHub; dobre przykłady
https://github.com/nesquena/rabl
źródło
Po prostu zaktualizuj tę odpowiedź ze względu na innych, którzy trafią na tę stronę.
W Railsach 3 wystarczy utworzyć plik pod adresem
views/users/show.json.erb
.@user
Obiekt będzie dostępny do widzenia (tak jak byłoby to dla html). Nie trzeba nawetto_json
więcej.Podsumowując, po prostu
i
źródło
respond_with @user, only: [:name]
. Więcej informacji znajdziesz w tym samouczku .Wystarczy dodać
show.json.erb
plik z zawartościąCzasami jest to przydatne, gdy potrzebujesz dodatkowych metod pomocniczych, które nie są dostępne w kontrolerze, np.
image_path(@user.avatar)
Lub czegoś do wygenerowania dodatkowych właściwości w JSON:źródło
<%= raw(@user.to_json) %>
unikanie ucieczki HTML. To, co robię, polega na tym, że polegam na to_json tak długo, jak długo daje mi to, czego chcę, ale kiedy chcę zrobić coś innego, szablon to za pomocą tego, co zwykle jest{ :blah => @user.the_blah }.to_json
.Jest to potencjalnie lepsza opcja i szybsza niż ERB: https://github.com/dewski/json_builder
źródło
Jestem nowy w RoR, oto co się dowiedziałem. możesz bezpośrednio renderować format json
źródło