2010-02-26 9 views
1

J'ai une application en cours d'exécution Rails 2.3.5 qui a une API JSON pour une grande partie de celui-ci.Comment remplacer le type MIME RJS dans Rails 2.3?

Un entrepreneur est entré et a travaillé sur l'application et a utilisé RJS dans quelques endroits. Certaines de ces actions de contrôleur qui utilisent RJS pour le site Web principal doivent également faire partie de l'API.

Le problème est que les requêtes API JSON déclenchent les réponses RJS, ce qui n'est pas ce que je veux. Je voudrais que les réponses RJS arrivent à partir d'un navigateur, mais quand il s'agit d'une demande d'API (comme en utilisant les en-têtes "application/json" Accept et Content-Type), je voudrais juste envoyer la réponse API.

D'après ce que je peux dire, Rails déclenche une réponse RJS pour tout type MIME qui implique javascript, à savoir

text/javascript l'application /JSON

etc.

est-il un moyen de forcer RJS à ne répondre qu'au texte/javascript? Ou y a-t-il une meilleure façon de résoudre ce problème?

Pour le rendre plus clair, j'ai le code qui ressemble à ceci:

def show 
    @dashboard = @user.dashboard 
    respond_to do |wants| 
    wants.html 
    wants.json { render :json => @dashboard } 
    end 
end 

Le problème est, il y a aussi un modèle show.rjs dans le dossier de vue pour ce contrôleur. Quand quelqu'un frappe l'API, je veux qu'elle rende les résultats de json, comme je l'ai indiqué ci-dessus, mais à la place, elle restitue le template show.rjs.

Comment puis-je m'assurer que les clients API obtiennent les résultats json que je veux, tout en laissant le modèle RJS s'afficher pour les personnes sur le site?

Répondre

0

Dans l'action de votre commande les opérations suivantes:

def index 
    respond_to do |format| 
    format.html # Renders index.html.erb as usual 
    format.xml { render :json => {:name => "raskchanky"}.to_json } 
    end 
end 

Selon la documentation Rails (http://api.rubyonrails.org/classes/ActionController/Base.html) "rendre: JSON" définit le type de contenu de la réponse à l'application/JSON.

0

Etes-vous sûr que votre javascript envoie la correctes en-têtes? Quand je fais des rjs, généralement je le fais en répondant à format.js. Cela me permet de séparer facilement les réponses json et js.

En règle générale, mes problèmes ont été de s'assurer que mes actions ajax sont en train d'envoyer des requêtes dans le format approprié. En cas de doute, vous pouvez ajouter un paramètre 'format': 'js' à votre requête. En jQuery:

// try to get it to figure out rjs actions by itself 
$('a').click(function(e){ 
    e.preventDefault(); 
    $.get({ 
    url: this.attr('href'), 
    dataType: 'script', 
    success: responseFunction 
    }); 
}); 

// or force the format 
$('a').click(function(e){ 
    e.preventDefault(); 
    $.get({ 
    url: this.attr('href'), 
    data: {format: 'js'}, 
    success: responseFunction 
    }); 
});