Learn how the new Rails UJS library works and compares with the old version of jquery_ujs that it replaces

rails/actionview/app/assets/javascripts/..

视频:https://gorails.com/episodes/rails-ujs-primer?autoplay=1


介绍
This unobtrusive scripting support file 脚本支持Rails,但不严格绑定在任何backend,也可以用在其他任何应用.

  • force confirmation dialogs for various actions;
  • make non-GET requests from hyperlinks;从超级链接制作非get请求
  • make forms or hyperlinks submit data asynchronously with Ajax;用Ajax制作表格或链接提交异步数据
  • 当已经点击提交按钮时,自动防止多次点击,导致重复提交。

These features are achieved by adding certain data attributes to your HTML markup.

这些功能是通过增加了data attributes到Http markup来实现的。

⚠️抛弃了jquery,使用coffeescript编译的。新要点:

  1. You won't get jQuery anymore in your Rails 5.1 applications
  2. Rails is starting to push you towards building your forms that all submit with AJAX requests

data = new FormData()


使用

rails app 直接在application.js中加上//= reqquire rails-ujs。

如果使用gem Webpacker或者其他的JS bundler,在主要main JS file增加以下代码:

import Rails from 'rails-ujs';
Rails.start()

定义了一些方便的语法糖,比如:

Rails.disableElement(document.getElementById("form_submit"))

解释:让link, button, form, formSubmit元素不能使用。还有enableElement(),让元素可以使用。

rails/actionview/app/assets/javascripts/rails-ujs/features/disable.coffee文件中定义的。

remote.coffe文件有处理ajax 请求的完美案例格式:⚠️这个格式是coffee格式。

Rails.ajax(

type: method or 'GET'
url: url
data: data
dataType: dataType

# stopping the "ajax:beforeSend" event will cancel the ajax request

# 不能用beforeSend:干别的事情,否则会停止ajax:beforeSend!!
beforeSend: (xhr, options) ->
  if fire(element, 'ajax:beforeSend', [xhr, options])
    fire(element, 'ajax:send', [xhr])
  else
    fire(element, 'ajax:stopped')
  return false

# success, complete都可以使用。
success: (args...) -> fire(element, 'ajax:success', args)
error: (args...) -> fire(element, 'ajax:error', args)
complete: (args...) -> fire(element, 'ajax:complete', args)
crossDomain: isCrossDomain(url)
withCredentials: withCredentials? and withCredentials isnt 'false'

案例:视频5.40分,我也实操成功了✌️

我写了一个只有一个输入框的表格,在chrome-inspect-console上声明一个form格式:

var data = new FormData()

data.append("post[content]", "输入的value")   

#post[content]是输入框的name, 具体可见webAPI, 用于附加一个新的value到一个已存在的 key

然后使用:

Rails.ajax({url: '/posts', type:"POST", data: data})

就正确提交了数据✌️,相当于submit。

解释:FormData()会创建空的表格对象。之后使用append("key", "value")附加给这个对象。

Rails.serializeElement()是一个UJS脚本方法。等同于使用传统的FormData(this)

data1 = new FormData(某个表格), data1获得表格内已有的所有数据对儿。

Csrf.coffee文件

Rails.csrfToken()
"SGFmdd/odcWc625LdYvcwUgi3jt+ou2H7FnKtH448qEksRvE0SHRESMuWS11wNaIrXicnnibw2VDaSeHIJt/tw=="

用于生成随机token。用于api

form.coffee文件

Rails.serializeElement()方法,一次性得到当前表格中已经输入的所有信息。

> var data1 = Rails.serializeElement(document.getElementsByTagName("form")[0])
undefined
> data1
"utf8=%E2%9C%93&authenticity_token=LSfv%2F12dCBYWSg%2FSgNCGQ5n4oV9h1wNBQD4YxqkgAPxB95JOU1SswqmPOLSAm4wKfKLj%2BmfuLaPvDvX194ON6g%3D%3D&post%5Bcontent%5D=xzczxxcz"
> Rails.ajax({url: '/posts', type:"POST", data: data1})
undefined

数据被存入。

RoR unobtrusive scripting adapter--UJS(一些Javascript的语法糖)的更多相关文章

  1. JavaScript calss语法糖

    JavaScript calss语法糖 基础知识 严格意义上来讲,在Js中是没有类这一概念的. 我们可以运用前面章节提到的构造函数来模拟出类这一概念,并且可以通过原型对象的继承来完美的实现实例对象方法 ...

  2. JavaScript中if语句优化和部分语法糖小技巧推荐

    前言 在前端日常开发过程中,if else判断语句使用的次数应该是比较频繁的了,一些较为复杂的场景,可能会用到很多判断,在某个代码块使用很多if else时,代码会显得较为冗余,阅读起来不够清晰. 除 ...

  3. JavaScript基本语法(一)

    前段时间学习了HTML和CSS,也实战了一些结构较简单的项目.在还没运用到JS的知识时,做出来的效果总觉得少了些什么.虽然总体布局与一些基本的特效,也能用HTML+CSS就能完成.但如今开始进入Jav ...

  4. javascript运算符语法概述

    × 目录 [1]个数 [2]优先级 [3]结合性[4]类型[5]规则表 前面的话 javascript中的运算符大多由标点符号表示,少数由关键字表示,它们的语法言简意赅,它们的数量却着实不少.运算符始 ...

  5. javascript基础语法——表达式

    × 目录 [1]原始表达式 [2]复杂表达式 前面的话 一般地,关于javascript基础语法,人们听得比较多的术语是操作符和语句.但是,其实还有一个术语经常使用,却很少被提到,这就是javascr ...

  6. javascript基础语法——词法结构

    × 目录 [1]java [2]定义 [3]大小写[4]保留字[5]注释[6]空白[7]分号 前面的话 javascript是一门简单的语言,也是一门复杂的语言.说它简单,是因为学会使用它只需片刻功夫 ...

  7. JavaScript的语法规则

    JavaScript的语法规则 JavaScript区分大小写 JavaScript脚本程序须嵌入在HTML文件中 JavaScript脚本程序中不能包含HTML标记代码 每行写一条脚本语句 语句末尾 ...

  8. JavaScript的语法要点 1 - Lexically Scoped Language

    作为从一开始接触C.C++.C#的程序员而言,JavaScript的语法对我来说有些古怪,通过最近一年的接触,对它有了一定的了解,于是想把它的一些语法要点记录下来. 1. Block Scope vs ...

  9. javascript的语法作用域你真的懂了吗

    原文:javascript的语法作用域你真的懂了吗 有段时间没有更新了,思绪一下子有点转不过来.正应了一句古话“一天不读书,无人看得出:一周不读书,开始会爆粗:一月不读书,智商输给猪.”.再加上周五晚 ...

随机推荐

  1. Dreamweaver 中CSS代码格式化

    首先,用DW打开一个已经写好的css文件,看一下编辑好的,没有格式化之前的代码的样子.   然后,我们点击软件窗口上方的“命令”选项,在弹出的菜单中点击“应用源格式”选项,就可以将我们的代码格式化. ...

  2. 【git】------git开发过程中的使用流程------【巷子】

    001.创建仓库 002.新建项目 003.初始化仓库  这一步不需要做 git init : 文件夹中会多出一个隐藏的.git文件 004.克隆项目 git clone <项目地址> 0 ...

  3. 170710、springboot编程之启动器Starter详解

    此文系参考网络大牛的,如有侵权,请见谅! Spring Boot应用启动器基本的一共有N(现知道的是44)种:具体如下: 1)spring-boot-starter 这是Spring Boot的核心启 ...

  4. 使用Dataset构建数据到lgb中

    训练数据要放到Dataset中供lgb使用,构建数据如下: import lightgbm as lgb import numpy as np # 训练数据,500个样本,10个维度 train_da ...

  5. 洛谷P3939 数颜色 二分查找

    正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ( ...

  6. SpringData_PagingAndSortingRepository接口

    该接口提供了分页与排序功能 Iterable<T> findAll(Sort sort); //排序 Page<T> findAll(Pageable pageable); / ...

  7. Keras实践:模型可视化

    Keras实践:模型可视化 安装Graphviz 官方网址为:http://www.graphviz.org/.我使用的是mac系统,所以我分享一下我使用时遇到的坑. Mac安装时在终端中执行: br ...

  8. 结巴分词中TFIDF的原理

    之前了解TFIDF只是基于公式,今天被阿里面试官问住了,所以深入讨论下TFIDF在结巴分词中原理. 概念 TF-IDF(term frequency–inverse document frequenc ...

  9. 17初识select

    多路复用 select 同时监控多个文件描述符的输入输出 <sys/types.h> <sys/times.h> <sys/select.h> int select ...

  10. "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 Solution

    A - 口算训练 题意:询问 $[L, R]$区间内 的所有数的乘积是否是D的倍数 思路:考虑分解质因数 显然,一个数$x > \sqrt{x} 的质因子只有一个$ 那么我们考虑将小于$\sqr ...