2011-01-08 4 views
0

j'utiliser Ruby on Rails 3 et I ont 2 applications (APP1 et APP2) travaillant sur deux sous-domaines:problème de cache en cours d'exécution de deux demandes HTTP GET consécutifs à partir d'un APP1 APP2 à un

  • app1.domain.local
  • app2.domain.local

et je suis tryng d'exécuter deux requêtes GET HTTP consécutives de APP1 à App2 comme ceci:

code dans APP1 (demande):

before_filter :run_request 

def run_request 
    response1 = Net::HTTP.get(URI.parse("http://app2.domain.local?test=first&id=1")) 
    response2 = Net::HTTP.get(URI.parse("http://app2.domain.local/test=second&id=1")) 
end 
code

dans APP2 (réponse):

before_filter :run_response 

def run_response 
    respond_to do |format| 
     if <model_name>.find(params[:id]).<field_name> == "first" 
     <model_name>.find(params[:id]).update_attribute (<field_name>, <field_value>) 
     format.xml { render :xml => <model_name>.find(params[:id]).<field_name> } 
     elsif <model_name>.find(params[:id]).<field_name> == "second" 
     format.xml { render :xml => <model_name>.find(params[:id]).<field_name> } 
     end 
    end 
end 

Après la première demande, je reçois le XML correct (response1 est ce que je pense), mais le second, il est pas (response2 est pas ce que j'attends). En effectuant quelques tests, j'ai trouvé que la seconde fois que <model_name>.find(params[:id]).<field_name> s'exécutait (pour les instructions elsif), elle renvoyait toujours une valeur vide afin que le code de l'instruction elseif ne soit jamais exécuté.

Est-il possible que le problème soit lié à la mise en cache <model_name>.find(params[:id]).<field_name>?


AVIS

Si je tente ce code

respond_to do |format| 
    if <model_name>.find(params[:id]).<field_name> == "first" 
    <model_name>.find(params[:id]).update_attribute (<field_name>, <field_value>) 
    format.xml { render :xml => <model_name>.find(params[:id]).<field_name> } 
    else 
    format.xml { render :xml => <model_name>.find(params[:id]) } 
    end 
end 

l'response2 est tout l'objet <model_name>.find(params[:id]. Notez que j'enlevé la condition « ELSIF » (pour exécuter la deuxième requête, afin que je puisse obtenir response2) et j'ai changé le code de

format.xml { render :xml => <model_name>.find(params[:id]) } 

à

format.xml { render :xml => <model_name>.find(params[:id]).<field_name> } 

PS: Je lis environ eTag and Conditional GET, mais je ne suis pas sûr que je dois utiliser cette approche. Je voudrais garder tout simple.

+0

Pourriez-vous ajouter le code complet pour l'action et corriger la faute de frappe dans la deuxième URL? – Heikki

+0

Le code "n'est pas dans une action" mais dans le 'application_controller.rb' pour APP1 (demandes) et APP2 (réponses). Là, j'ai un 'before_filter' qui appelle les demandes et les réponses. – user502052

+0

Encore une fois, vous devriez montrer vos journaux sur APP2 ... – apneadiving

Répondre

0

Il est possible que la requête soit mise en cache au niveau du contrôleur d'application. Rails détruit les caches de requête à la fin des actions, mais vos requêtes ne sont pas dans une action. Pour ce que cela vaut le code dans APP2, il ne devrait probablement pas être dans le contrôleur d'application, mais dans une action dans le contrôleur. Cela est beaucoup plus RESTful, et prendra probablement aussi soin des problèmes de mise en cache (car Rails effacera le cache de requête entre les demandes d'APP1).

Questions connexes