视频:

https://gorails.com/episodes/how-to-use-turbolinks-clearCache?autoplay=1

用途:

更方便的实时从服务器更新局部网页,在这页更新了一条记录的显示方式,

再打开的之前网页的相同位置或相同的功能模块显示也会同步更新。

把Turbolinks.clearCache(),比如放在你写的create.js.erb的第一行。

理解:

原代码写在gem中,它清除了JS behavior of a 302 redirect通过增加一行代码:

第一行是清除

script << "Turbolinks.clearCache()"

第二行是告诉Turbolinks下一步显示什么页面:

script << "Turbolinks.visit(#{location.to_json}, #{visit_options.to_json})"

现在Turbolinks生效了。无论何时一个redirect发送同时请求是一个JS请求,这2行代码会加入的response

提示:

1.如果不加这句话,turbolinks只会reload之前的网页中的数据。并不会取server-side获取新数据。

加上这句话,会强迫浏览器从服务器reload对应的数据,替代trubolinks cash。

2.如果不使用turbolinks,你就得使用HTTP headers for caching, 告诉它必须总是从服务器上reload这个网页。

⚠️:

302 redirect: 302 代表暂时性转移(Temporarily Moved )

301 redirect: 301 代表永久性转移(Permanently Moved)


敏捷rails5.1同步更新的知识点:

rails5有了使用web Sockets的action cable库,更强的实现实时更新。

http://www.cnblogs.com/chentianwei/p/8690304.html

同时,简化了推数据到所有连接的browsers。

比如:

打开了2个浏览器窗口,其中一个窗口的数据显示更新了,另一个窗口无需刷新也会同步更新。

三步走:

1.创建一个频道

2.广播数据

3.接收数据。

例子:建立products的频道:

第一步:

rails g channel products

  create app/channels/products_channel.rb

  identical app/assets/javascripts/cable.js

  create app/assets/javascripts/channels/products.coffee

在开发模式下,Channels有安全机制,默认Rails只允许从localhost存取。如果需要多个技巧同时开发,需要设置:config/environments/development.rb:

config.action_cable.disable_request_forgery_protection = true

然后在app/channels/products_channel.rb中设置,订阅的频道名字是"products"

class ProductsChannel < ApplicationCable::Channel

def subscribed

stream_from "products"

end

def unsubscribed

# Any cleanup needed when channel is unsubscribed

end

end

第二步:广播数据:

在products_controller.rb:

def update

respond_to do |format|

if @product.update(product_params)

format.html { redirect_to @product,

notice: 'Product was successfully updated.' }

format.json { render :show, status: :ok, location: @product }

@products = Product.all

ActionCable.server.broadcast 'products',

      html: render_to_string('store/index', layout: false)

else

format.html { render :edit }

format.json { render json: @product.errors,

status: :unprocessable_entity }

end

end

end

因为使用store/index,上面显示了所有products。所以设置了@products实例变量。

'products' 是stream名字

使用,render_to_string(*args), 只会返回一个string。不会设置respond_body。

layout: false,只要view,不要整个page。

Broadcast messages是由Ruby hashes组成的, 会转化为JSON,穿越wire,然后以一个JavaScript object结束。

本案例使用html作为hash key.

这是格式:具体一个格式案例见api文档: ActionCable::Server::Broadcasting

broadcast(broadcasting, message, coder: ActiveSupport::JSON)

broadcasting是一个命名的stream名字。

第三步:在客户端接受数据

涉及订阅频道和定义当数据收到后做什么。

products.coffee中,生成了一个类,和三个方法:connected, disconnected, received。

本案例关心的是received: 因为他called送到channel的数据。这个数据是一个html属性,由更新的HTML组成。

你可以使用getElementByTagName来定位所有main elements。

  received: (data) ->
document.getElementsByTagName("main")[0].innerHTML = data.html

实时更新数据,无需刷新:a,如何使用Turbolinks clearCache(), b Action Cable的更多相关文章

  1. 数据可视化:Echart中k图实现动态阈值报警及实时更新数据

    1 目标 使用Echart的k图展现上下阈值,并且当真实值超过上阈值或低于下阈值时候,标红报警. 2 实现效果 如下:

  2. 实时更新数据的jQuery图表插件DEMO演示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Qt之模型/视图(实时更新数据)

    上两节简单介绍了Qt中对于模型/视图的编程,大部分助手里说的很清楚了,现在就开始实战部分吧! 在实际应用中,视图展示的数据往往并非一成不变的,那么如何实时更新成了一个很重要的问题!功能:(1)添加委托 ...

  4. AJAX制作JSON格式的实时更新数据的方法

    之前有写过这样的文章,但是出现了几个问题,第一,如果每秒都像数据库发送请求势必会造成服务器的压力过大,第二,如果使用JS的话,是不可以取得系统时间的,因为JS运行在客户端,所以只能取得客户端时间, 如 ...

  5. 实现DataGridView实时更新数据

    ;).ToString() + ).ToString() + "秒";        } }}

  6. IDEA 修改JSP和后端数据后,页面刷新可以实时更新

    情况:刚开始使用IDEA进行开发时,发现修改JSP页面或者后端数据后,再刷新浏览器页面,发现没有变化,页面无更新. 这样就导致不得不频繁重启tomcat服务器.非常麻烦 解决方法: 步骤1. 先设置t ...

  7. MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新

    MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新 关键代码: //发送数据通知 //from txwtech@163.com LRESULT CCommSampleDlg::O ...

  8. Python tkinter库将matplotlib图表显示在GUI窗口上,并实时更新刷新数据

    代码 1 ''' 2 使用matplotlib创建图表,并显示在tk窗口 3 ''' 4 import matplotlib.pyplot as plt 5 from matplotlib.pylab ...

  9. 使用AjaxPro实现无刷新更新数据

    需求 在一个页面动态无刷新的更新后台得到的数据.要想无刷新的更新数据,需要使用Javascript能够获取后台返回的数据,然后通过第三方Javascript库(JQuery等)动态更新web页面DOM ...

随机推荐

  1. 02.MyBatis配置文件详解

        MyBatis入参考文档:http://mybatis.org/mybatis-3/zh/  1.properties 属性 1.在MyBatis配置文件中引用属性文件     MyBatis ...

  2. Oracle系统结构之修改oracle内存参数

    Linux主机16g内存,修改oracle数据库内存参数: 1.编辑/etc/fstab文件:针对tmpfs行将defaults改成defaults,size=12g(千万注意格式,不能出现错误) 修 ...

  3. Sum It Up---poj1564(dfs)

    题目链接:http://poj.org/problem?id=1564 给出m个数,求出和为n的组合方式:并按从大到小的顺序输出: 简单的dfs但是看了代码才会: #include <cstdi ...

  4. 一道题浅析 i++,++i,i+1及(引用)&i的区别

    我们可能很清楚i++,++i和i+1级&i的概念,但在实际运用中我们就有可能很容易搞混淆.特别是在递归中区别它们就显得尤为重要了.那首先我们先看一段利用递归逆序字符串的代码,你能回答出这段代码 ...

  5. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  6. EdrawSoft Edraw Max 9.1安装破解

    1,安装软件[不要运行软件] 2,断网 3,打开Crack文件夹,复制”BaseCore.dll”,”ObjectModule.dll”到软件安装目录下替换原文件 默认的安装路径C:\Program ...

  7. git相关使用技巧和问题

    本地有修改和提交,如何强制用远程的库更新更新.我尝试过用git pull -f,总是提示 You have not concluded your merge. (MERGE_HEAD exists). ...

  8. postman设置环境变量,字段值经过json转换后数值字节长度超过上限的问题

    在使用Tests进行环境变量的设置时,遇到这么一种情况,在返回的responseBody中的userId字段,字段返回的是数值类型,再经过json转换之后,发现保存的值跟接口返回的值不一致:如下图: ...

  9. java对象,引用的区别

    一,其实 对象 就是一个类的实例 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程 ...

  10. python16_day27【crm 内嵌、删除、action】

    一.内嵌 二.删除及关联关联显示 三.action