Проблема с кэшем при выполнении двух последовательных HTTP-запросов GET от APP1 к APP2 - PullRequest
0 голосов
/ 09 января 2011

Я использую Ruby on Rails 3 и у меня есть 2 приложения (APP1 и APP2), работающие на двух поддоменах:

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

и я пытаюсь запустить два последовательных HTTP-запроса GET от APP1 к APP2 следующим образом:

Код в APP1 (запрос):

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

Код вAPP2 (ответ):

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

После первого запроса я получаю правильный XML (response1 - это то, что я ожидаю), но на втором - нет (response2 - не то, что я ожидаю).Выполняя некоторые тесты, я обнаружил, что во второй раз, когда <model_name>.find(params[:id]).<field_name> запускается (для операторов elsif), он всегда возвращает пустое значение, так что код в операторе elseif никогда не запускается.

Возможно ли, что проблемаотносится к кешированию <model_name>.find(params[:id]).<field_name>?


УВЕДОМЛЕНИЕ

Если я попробую этот код

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

, response2 - это целый <model_name>.find(params[:id] объект.Обратите внимание, что я удалил условие «elsif» (чтобы выполнить второй запрос, чтобы я мог получить response2) и изменил код с

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

на

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

PS: я читал о eTag и условном GET , но я не уверен, что должен использовать этот подход.Я хотел бы, чтобы все было просто.

1 Ответ

0 голосов
/ 09 января 2011

Возможно, запрос кешируется на уровне контроллера приложения. Rails уничтожает кеш запросов в конце действий, но ваши запросы не находятся в действии.

Для чего стоит код в APP2, скорее всего, должен быть не в контроллере приложения, а в действии в контроллере. Это гораздо более RESTful и, вероятно, также позаботится о проблемах кэширования (так как Rails очистит кеш запросов между запросами APP1).

...