2008-09-11 10 views

Répondre

10

Voyons voir.

Modèle

class Contact < ActiveRecord::Base 
    ... 
end 

Routes

map.resources :contacts 

contrôleur

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 

Donc, cela vous donne une interface API sans la nécessité de définir des méthodes spéciales pour obtenir le type de répondre requis

Par exemple.

/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

Bonne réponse! Si je peux le mettre à jour vers Rails 3, la méthode json semble maintenant être to_json. Au moins c'est ce qui a fonctionné pour moi ... c'est-à-dire @ contact.to_json – codedog

2

Rails monkeypatches la plupart des choses que vous voulez bien sur le point d'avoir une méthode #to_json.

En haut de ma tête, vous pouvez le faire pour les hachages, les tableaux et les objets ActiveRecord, qui devraient couvrir environ 95% des cas d'utilisation que vous pourriez souhaiter. Si vous avez vos propres objets personnalisés, il est trivial d'y écrire votre propre méthode to_json, qui peut simplement bloquer les données dans un hachage, puis renvoyer le hachage jsonized.

+0

monkeypatches? Je n'ai aucune idée de ce que cela signifie, mais je pourrais deviner qu'il s'agit de fournir cette méthode à la plupart des objets, sinon tous, –

+1

Il corrige un objet existant, en ajoutant la méthode ou en la modifiant si elle existe. C'est vraiment juste une extension de langage dynamique. –

0

ActiveRecord fournit également des méthodes pour interagir avec JSON. Pour créer un JSON à partir d'un objet AR, appelez simplement object.to_json. Pour créer un objet AR à partir de JSON, vous devriez être capable de créer un nouvel objet AR, puis appeler object.from_json .. pour autant que j'ai compris, mais cela n'a pas fonctionné pour moi.

Questions connexes