视频:

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. nginx安装和测试 (已验证)

    进入:/usr/local/nginx 目录注意:为了保证各插件之间的版本兼容和稳定,建议先通过以下版本进行测试验证. 一.下载版本 下载nginx: wget http://nginx.org/do ...

  2. 170622、springboot编程之JPA操作数据库

    JPA操作数据库 什么事JAP?JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 1.在pom ...

  3. Nginx + Tomcat 负载均衡配置详解

    Nginx常用操作指南一.Nginx 与 Tomcat 安装.配置及优化1. 检查和安装依赖项 yum -y install gcc pcre pcre-devel zlib zlib-devel o ...

  4. Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转

    小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...

  5. scrapy爬虫系列之开头--scrapy知识点

    介绍:Scrapy是一个为了爬取网站数据.提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速抓取.Scrapy使用了Twisted异步网络框架,可以加快我们的下载速度. 0.说明: ...

  6. UVA796 - Critical Links(Tarjan求桥)

    In a computer network a link L, which interconnects two servers, is considered critical if there are ...

  7. Ultra-QuickSort---poj2299 (归并排序.逆序数.树状数组.离散化)

    题目链接:http://poj.org/problem?id=2299 题意就是求把数组按从小到大的顺序排列,每次只能交换相邻的两个数, 求至少交换了几次 就是求逆序数 #include<std ...

  8. 【云安全与同态加密_调研分析(7)】安全技术在云计算中的安全应用分析——By Me

                                                                   我司安全技术在云计算中的安全应用分析 1. 基于云计算参考模型,分析我司安 ...

  9. POJ2186:Popular Cows(tarjan+缩点)

    题目解析: 这题题意没什么好说的,解法也挺简单的,只要会tarjan算法+只有一个出度为0的强连通分量题目有解这题就迎刃而解了. #include <iostream> #include ...

  10. Selenium之Chrome浏览器的启动问题及解决

    System.setProperty("webdriver.chrome.driver","chromedriver.exe路径"); 配置好Chrome的驱动 ...