ruby-on-rails - 单击“后退”按钮时,直接从缓存中获得响应

标签 ruby-on-rails caching backbone.js browser-history pushstate

请注意,我认为此问题与Backbone或JavaScript不相关,但是有必要包含一些Backbone代码作为此问题的上下文。

相关代码

我有一个client-side Backbone router,其路由带有一个称为contactId的参数。它看起来类似于:

Backbone.Router.extend({

  routes: {
    "jobs/new?contact_id=:contactId": "newForContact"
  },

  // Fetch the contact and initialize a new job model which 
  // is associated with that contact.
  newForContact: function(contactId) {
    var contact = new Contact(id: contactId);
    contact.fetch({
      success: _.bind(function(model, resp) {
        var job = new Job(contact: contact);
        this.new(job);
      }
    }, this));
  },

  // Show the JobView for the given job.
  new: function(jobModel) {
    view = new JobView(job: jobModel);
    $('body').append(view.render().el);
  }
};

现在,我尝试在pushState启用的情况下使用此设置。

当我点击触发newForContact路由的路由时,一切都会按预期进行。但是,如果此时按下浏览器的后退按钮,则会从contact.fetch()方法直接从浏览器的缓存中获取JSON响应。没有请求发送到服务器。

应用程序日志

您可以在Rails应用程序日志中看到它。在这一部分中,我将访问触发newForContact的路线。
Started GET "/jobs/new?contact%5Bid%5D=1&contact%5Btype%5D=Customer" for 127.0.0.1 at 2012-10-31 22:41:48 +0000
Processing by JobsController#new as HTML
  Parameters: {"contact"=>{"id"=>"1", "type"=>"Customer"}}
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  Business Load (0.3ms)  SELECT "businesses".* FROM "businesses" WHERE "businesses"."id" IN (1)
  Rendered shared/_search_form.html.erb (0.3ms)
  Job Load (0.4ms)  SELECT "jobs".* FROM "jobs" WHERE "jobs"."business_id" = 1 ORDER BY created_at desc
  Rendered jobs/_list.html.erb (1.5ms)
  Rendered jobs/index.html.erb within layouts/application (4.1ms)
  Rendered layouts/_head_content.html.erb (0.7ms)
  Rendered layouts/_flash.html.erb (0.0ms)
Cache read: views/jobs/main_nav/d6a805d9b6f285e424f207add4f35595
Read fragment views/jobs/main_nav/d6a805d9b6f285e424f207add4f35595 (0.4ms)
  Rendered layouts/_nav.html.erb (0.6ms)
  Rendered layouts/_header.html.erb (0.7ms)
Completed 200 OK in 12ms (Views: 8.0ms | ActiveRecord: 1.0ms)
Cache read: http://print.dev/customers/1?

您可以看到它此时通过JSON请求获取联系人。
Started GET "/customers/1" for 127.0.0.1 at 2012-10-31 22:41:48 +0000
Processing by CustomersController#show as JSON
  Parameters: {"id"=>"1"}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  Business Load (0.4ms)  SELECT "businesses".* FROM "businesses" WHERE "businesses"."id" IN (1)
  Customer Load (0.2ms)  SELECT "customers".* FROM "customers" WHERE "customers"."business_id" = 1 AND "customers"."id" = $1 LIMIT 1  [["id", "1"]]
  CustomerEmployee Load (0.3ms)  SELECT "customer_employees".* FROM "customer_employees" WHERE "customer_employees"."employer_id" IN (1)
  Job Load (0.4ms)  SELECT "jobs".* FROM "jobs" WHERE "jobs"."contact_type" = 'Customer' AND "jobs"."contact_id" IN (1)
  Invoice Load (0.3ms)  SELECT "invoices".* FROM "invoices" WHERE "invoices"."client_id" IN (1)
  Job Load (0.5ms)  SELECT "jobs".* FROM "jobs" WHERE "jobs"."contact_id" = 1 AND "jobs"."contact_type" = 'Customer' AND "jobs"."state" = 'finished' AND "jobs"."invoice_id" IS NULL
  Rendered customers/show.json.rabl (2.8ms)
Completed 200 OK in 67ms (Views: 3.2ms | ActiveRecord: 2.5ms)

此时,我将按浏览器的“后退”按钮,但是服务器上没有记录新的请求。

Rails环境

这仅在我的登台服务器(Heroku)上发生,而不在开发中发生。我可以在临时环境中通过使用Pow运行该应用程序在本地重新创建它,该环境已在rails配置中启用了缓存。
config.action_controller.perform_caching = true

请注意,即使启用了缓存,我也无法在开发环境中重新创建该错误。

Chrome 22.0.1229.94FF 16.0.2Safari 6.0.1中会发生此问题。我正在使用Rails 3.2.8

可能相关的问题

It seems like this guy was having a very similar problem to me.

实时样本

如果您确实愿意,可以在Heroku的我的登台服务器上实时查看问题。

复制步骤(编辑:这些步骤自从我修复问题以来不再起作用)。
  • 使用电子邮件:user@example.com登录here并通过:foobar
  • 访问http://print-staging.herokuapp.com/customers/2。您应该会看到一个看起来困惑的对话框。
  • 单击对话框中的小“新作业”链接。页面应该会更改,并且应该会打开一个新对话框。
  • 单击浏览器后退按钮。
  • 最佳答案

    您可以在服务器端的响应中添加一个no-cache头,这应该指示浏览器不要缓存响应:

    response.headers["Cache-Control"] = "no-cache"
    

    关于ruby-on-rails - 单击“后退”按钮时,直接从缓存中获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130216/

    相关文章:

    C# ServiceStack.Redis SetAll 过期

    javascript - 强制更新时缓存 list 文件不会过期 JavaScript 文件

    mysql - rails : How to store extra attributes using single table inheritance?

    ruby-on-rails - 我如何查看哪些作业已使用 resque-scheduler 排队?

    ruby-on-rails - 更快地编写此 rake 命令的方法 - rake db :drop db:create db:migrate db:seed

    ruby-on-rails - Rails 排序或排序查询很慢

    mysql - Laravel Caching 用户相关的缓存

    javascript - 使用 Backbone.js 设置我的模型

    javascript - Backbone 路由 - 页面加载时触发路由

    javascript - Backbone - 嵌套在模型中的集合