2008-09-11 27 views

Respuesta

10

Rails resource ofrece una interfaz RESTful para su modelo. Veamos.

Modelo

class Contact < ActiveRecord::Base 
    ... 
end 

Rutas

map.resources :contacts 

Controlador

class ContactsController < ApplicationController 
    ... 
    def show 
    @contact = Contact.find(params[:id] 

    respond_to do |format| 
     format.html 
     format.xml {render :xml => @contact} 
     format.js {render :json => @contact.json} 
    end 
    end 
    ... 
end 

Así que esto le da una interfaces API y sin la necesidad de definir métodos especiales para obtener el tipo de responder requiere

Eg.

/contacts/1 # Responds with regular html page 

/contacts/1.xml # Responds with xml output of Contact.find(1) and its attributes 

/contacts/1.js # Responds with json output of Contact.find(1) and its attributes 
+0

¡Gran respuesta! Si puedo actualizarlo a Rails 3, el método json ahora parece ser to_json. Al menos eso es lo que funcionó para mí ... es decir, @ contact.to_json – codedog

2

rieles monkeypatches la mayoría de las cosas que le importan a tener un método #to_json.

En la parte superior de mi cabeza, puedes hacerlo para hashes, matrices y objetos ActiveRecord, que deberían cubrir aproximadamente el 95% de los casos de uso que te puedan interesar. Si tiene sus propios objetos personalizados, es trivial escribir su propio método to_json para ellos, que puede simplemente atascar datos en un hash y luego devolver el hash jsonizado.

+0

monkeypatches? No tengo idea de lo que eso significa, pero podría adivinar que se refiere a proporcionar ese método a la mayoría de los objetos, si no a todos –

+1

Está parcheando un objeto existente, agregando el método o cambiándolo si existe. Realmente es solo una extensión de lenguaje dinámico. –

0

ActiveRecord también proporciona métodos para interactuar con JSON. Para crear JSON desde un objeto AR, simplemente llame a object.to_json. Para crear un objeto AR a partir de JSON, debería poder crear un nuevo objeto AR y luego llamar a object.from_json .. por lo que yo entendía, pero esto no funcionó para mí.

Cuestiones relacionadas