W Rails, jak renderować JSON używając widoku?

Załóżmy, że jesteś w swoim kontrolerze users i chcesz uzyskać odpowiedź json na żądanie show, byłoby miło, gdybyś mógł utworzyć plik w katalogu views/users/ o nazwie show.json i po zakończeniu operacji users#show plik zostanie renderowany.

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ł stworzyć program.plik 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
To oszczędziłoby mi wielu zmartwień., i zmyje to strasznie brudne uczucie, które mam, gdy renderuję mój json w kontrolerze
Author: Matthew, 2010-01-18

7 answers

Powinieneś być w stanie zrobić coś takiego w swoim respond_to bloku:

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

Który wyrenderuje szablon w app/views/users/_show.json.erb.

 62
Author: Alex Reisner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-15 12:01:54

Spróbuj dodać Widok users/show.json.erb powinien on być renderowany, gdy składasz żądanie formatu JSON, a dodatkową zaletą jest to, że jest renderowany również przez erb, aby Twój plik mógł wyglądać mniej więcej tak

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}
 53
Author: erik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 13:58:40

Jak inni wspomnieli, potrzebujesz usera / show.widok json, ale są opcje do rozważenia dla języka szablonów...

ERB

Działa po wyjęciu z pudełka. Świetny dla HTML, ale szybko przekonasz się, że jest okropny dla JSON.

RABL

Dobre rozwiązanie. Trzeba dodać zależność i nauczyć się jej DSL.

JSON Builder

To samo co RABL: dobre rozwiązanie. Trzeba dodać zależność i nauczyć się jej DSL.

Plain Ruby

Ruby jest świetny w generowaniu JSON i nie ma nic nowego do nauczenia się, jak można wywołać to_json na obiekcie Hash lub ar. Wystarczy zarejestrować .rozszerzenie rb dla szablonów (w inicjalizatorze):

ActionView::Template.register_template_handler(:rb, :source.to_proc)

Następnie Utwórz widok users / show.json.rb:

@user.to_json

Aby uzyskać więcej informacji na temat tego podejścia zobacz http://railscasts.com/episodes/379-template-handlers

 29
Author: tybro0103,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 14:53:46

RABL jest prawdopodobnie najładniejszym rozwiązaniem tego, jakie widziałem, jeśli szukasz czystszej alternatywy dla składni ERb. json_builder i argonaut, które są innymi rozwiązaniami, oba wydają się nieco przestarzałe i nie będą działać z Rails 3.1 bez pewnych poprawek.

RABL jest dostępny przez gem lub sprawdź repozytorium GitHub; dobre przykłady też

Https://github.com/nesquena/rabl

 27
Author: zapnap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-28 21:47:04

Po prostu zaktualizować tę odpowiedź dla dobra innych, którzy zdarzy się skończyć na tej stronie.

W Rails 3 wystarczy utworzyć plik w views/users/show.json.erb. Obiekt @user będzie dostępny dla widoku (tak samo jak dla html.) Już nawet nie potrzebujesz to_json.

Podsumowując, to po prostu

# users contoller
def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

I

/* views/users/show.json.erb */
{
    "name" : "<%= @user.name %>"
}
 21
Author: James Lim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 15:39:53

Wystarczy dodać show.json.erb Plik z zawartością

<%= @user.to_json %>

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:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>
 9
Author: Priit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-18 18:48:59

Jest to potencjalnie lepsza opcja i szybsza niż ERB: https://github.com/dewski/json_builder

 6
Author: PETER BROWN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 17:59:41