2010-12-19 4 views
3
def call(env) 
    status, headers, response = @app.call(env) 

    if response.is_a? Array 
     puts response.inspect 
    else 
     puts response.class.to_s 
    end 

    [status, headers, response] 
    end 

De development.log:Rails3 réponse Rack - méthode non définie response.body

Première demande:

Completed 200 OK in 95ms (Views: 35.9ms | ActiveRecord: 1.5ms) 
ActionDispatch::Response 

deuxième et autres demandes:

Completed 200 OK in 77ms (Views: 76.3ms | ActiveRecord: 0.0ms) 
[] 
réponse

est un: ActionDispatch::Response la première fois qu'une route est appelée, pour toute autre demande pour cette URL exacte, il s'agit d'un 01 vide

La page s'affiche correctement dans les deux cas, mais je ne peux pas utiliser response.body lorsque la réponse est un tableau vide.

Est-ce un comportement normal de Rails? Y a-t-il un cache ici même dans un environnement de développement?

Répondre

1

Je vois la même chose.

Je trouve que la console ne ferait que montrer le dernier code d'état HTTP (200 OK), mais avec la console de débogage je vois un code différent (304, "Non modifié". More on that here)

La nature du Le code 304 indique que la réponse sera vide, car le serveur demande à votre navigateur de n'utiliser que le cache. Votre navigateur envoie un GET conditionnel (ce qui devrait être un comportement normal du navigateur?) Et c'est ce qui fait que votre serveur se comporte ainsi. Votre navigateur ne sait pas que vous êtes en mode développement, donc il se comportera normalement.

Notez que j'ai pu contourner cette erreur en faisant CTRL-F5 pour un rafraîchissement (dans Firefox), qui est une commande pour "rafraîchir et ignorer le cache". Ainsi, le navigateur fait un simple GET au lieu d'un conditionnel.

Voici le code que j'ai utilisé pour m'aider à comprendre ce qui se passait (nécessite la gemme ruby-debug).

def call(env) 
    status, headers, response = @app.call(env) 
    debugger 
    if headers["Content-Type"].include?("text/html") 
    [status, headers, "<!--hello world! -->" + response.body] 
    else 
    [status, headers, response] 
    end 
end 

Après avoir fait cela, chargez la page et dans le terminal rail server:

(rdb:1) irb 
irb(#<PostRedirect:0x7f9c6292a530>):001:0> status 
=> 304 

Mon solution était d'ajouter un contrôle de code d'état:

if (status != 304) && headers["Content-Type"].include?("text/html") 
+0

Vous avez raison, et je pense Les en-têtes "eTag" provoquent le statut 304. – Mirko

+1

Oui, cela semble correct. Je pense que la plupart des sites devraient maintenant supporter les en-têtes eTag car ils économisent de la bande passante et permettent des chargements de pages plus rapides si le site est inchangé par rapport à une visite précédente. Cela dit, cela ne fait pas vraiment de différence pour les petits sites web, et n'est probablement pas visible en mode développement (puisque vous avez une latence proche de zéro pour votre demande de page) –

Questions connexes