Suponha que você esteja no controlador de usuários e deseje obter uma resposta json para uma solicitação de show; seria bom se você pudesse criar um arquivo em suas views / users / dir, chamado show.json e depois dos usuários # show ação for concluída, renderiza o arquivo.
Atualmente, você precisa fazer algo como:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json{
render :json => @user.to_json
}
end
end
Mas seria bom se você pudesse criar um arquivo show.json que seja automaticamente renderizado da seguinte maneira:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
Isso me pouparia muito pesar e eliminaria aquela sensação horrivelmente suja que sinto quando renderizo meu json no controlador
format.json
com umshow.json.erb
arquivo. Veja minha resposta.Respostas:
Você deve conseguir fazer algo assim no seu
respond_to
bloco:que renderizará o modelo
app/views/users/_show.json.erb
.fonte
Tente adicionar uma visualização
users/show.json.erb
Isso deve ser renderizado quando você faz uma solicitação para o formato JSON e obtém o benefício adicional de ser renderizado pelo erb também, para que seu arquivo possa ter algo parecido com istofonte
@user.first_name.to_json
vez deescape_javascript
. Existem algumas diferenças sutis entre o que o JS permite e o que é estritamente o JSON. (E essas diferenças estão se tornando importante como navegadores implementar seus próprios analisadores JSON.)<%= xyz.to_json %>
caso contrário você ficará com aspas extras.Como outros já mencionaram, você precisa de uma visão users / show.json, mas há opções a serem consideradas no idioma do modelo ...
ERB
Trabalha fora da caixa. Ótimo para HTML, mas você rapidamente descobrirá que é horrível para JSON.
RABL
Boa solução. Tem que adicionar uma dependência e aprender sua DSL.
Construtor JSON
O mesmo negócio que o RABL: boa solução. Tem que adicionar uma dependência e aprender sua DSL.
Plain Ruby
Ruby é incrível na geração de JSON e não há nada novo para aprender, pois você pode chamar
to_json
um Hash ou um objeto AR. Basta registrar a extensão .rb para modelos (em um inicializador):Em seguida, crie a visão users / show.json.rb:
Para mais informações sobre essa abordagem, consulte http://railscasts.com/episodes/379-template-handlers
fonte
O RABL é provavelmente a melhor solução para isso que eu já vi se estiver procurando uma alternativa mais limpa à sintaxe do ERb. json_builder e argonaut, que são outras soluções, parecem um pouco desatualizados e não funcionarão com o Rails 3.1 sem correções.
O RABL está disponível via gem ou consulte o repositório GitHub; bons exemplos também
https://github.com/nesquena/rabl
fonte
Apenas para atualizar esta resposta em prol de outras pessoas que acabam nesta página.
No Rails 3, você só precisa criar um arquivo em
views/users/show.json.erb
. O@user
objeto estará disponível para a visualização (como seria para html.) Você nem precisato_json
mais.Para resumir, é apenas
e
fonte
respond_with @user, only: [:name]
. Consulte este tutorial para obter mais informações.Basta adicionar
show.json.erb
arquivo com o conteúdoÀs vezes, é útil quando você precisa de alguns métodos auxiliares adicionais que não estão disponíveis no controlador,
image_path(@user.avatar)
ou seja, ou algo para gerar propriedades adicionais no JSON:fonte
<%= raw(@user.to_json) %>
evitar o escape de HTML. O que faço é confiar no to_json, desde que ele me dê o que quero, mas quando quero fazer outra coisa, modelo-o com o que geralmente é um{ :blah => @user.the_blah }.to_json
.Esta é potencialmente uma opção melhor e mais rápida que ERB: https://github.com/dewski/json_builder
fonte
Sou novo no RoR, foi o que descobri. você pode renderizar diretamente um formato json
fonte