Supongamos que está en el controlador de su usuario y desea obtener una respuesta json para una solicitud de presentación, sería bueno si pudiera crear un archivo en sus vistas / usuarios / directorio, llamado show.json y después de que sus usuarios # show se completa la acción, representa el archivo.
Actualmente necesita hacer algo en la línea de:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json{
render :json => @user.to_json
}
end
end
Pero sería bueno si pudieras crear un archivo show.json que automáticamente se procesa así:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
Esto me ahorraría toneladas de dolor y eliminaría esa sensación horriblemente sucia que tengo cuando renderizo mi json en el controlador
format.json
con unshow.json.erb
archivo. Mira mi respuesta.Respuestas:
Debería poder hacer algo como esto en su
respond_to
bloque:que representará la plantilla en
app/views/users/_show.json.erb
.fuente
Intente agregar una vista.
users/show.json.erb
Esto se debe representar cuando realiza una solicitud para el formato JSON, y obtiene el beneficio adicional de que también lo representa erb, por lo que su archivo podría verse asífuente
@user.first_name.to_json
lugar deescape_javascript
. Hay algunas diferencias sutiles entre lo que JS permite y lo que es estrictamente JSON. (Y esas diferencias se están volviendo importantes a medida que los navegadores implementan sus propios analizadores JSON.)<%= xyz.to_json %>
contrario te quedarán comillas adicionales.Como otros han mencionado, necesita una vista users / show.json, pero hay opciones a considerar para el lenguaje de plantillas ...
ERB
Funciona fuera de la caja. Excelente para HTML, pero rápidamente encontrará que es horrible para JSON.
RABL
Buena solución. Tiene que agregar una dependencia y aprender su DSL.
JSON Builder
Mismo trato que RABL: buena solución. Tiene que agregar una dependencia y aprender su DSL.
Rubí liso
Ruby es increíble para generar JSON y no hay nada nuevo que aprender, ya que puedes invocar
to_json
un Hash o un objeto AR. Simplemente registre la extensión .rb para plantillas (en un inicializador):Luego cree la vista users / show.json.rb:
Para obtener más información sobre este enfoque, visite http://railscasts.com/episodes/379-template-handlers
fuente
RABL es probablemente la mejor solución para esto que he visto si está buscando una alternativa más limpia a la sintaxis de ERb. json_builder y argonaut, que son otras soluciones, parecen algo obsoletos y no funcionarán con Rails 3.1 sin algunos parches.
RABL está disponible a través de una gema o consulte el repositorio de GitHub; buenos ejemplos también
https://github.com/nesquena/rabl
fuente
Solo para actualizar esta respuesta por el bien de otros que terminan en esta página.
En Rails 3, solo necesita crear un archivo en
views/users/show.json.erb
. El@user
objeto estará disponible para la vista (al igual que lo estaría para html). Ya ni siquiera lo necesitato_json
.Para resumir, es solo
y
fuente
respond_with @user, only: [:name]
. Consulte este tutorial para obtener más información.Simplemente agregue el
show.json.erb
archivo con el contenidoA veces es útil cuando necesita algunos métodos auxiliares adicionales que no están disponibles en el controlador, es decir,
image_path(@user.avatar)
o algo para generar propiedades adicionales en JSON:fuente
<%= raw(@user.to_json) %>
para evitar el escape de HTML. Lo que hago es confiar en to_json siempre que me dé lo que quiero, pero cuando quiero hacer algo más, lo moldeo con lo que generalmente es a{ :blah => @user.the_blah }.to_json
.Esta es potencialmente una mejor opción y más rápida que ERB: https://github.com/dewski/json_builder
fuente
Soy nuevo en RoR, esto es lo que descubrí. puedes renderizar directamente un formato json
fuente