回顾知识点

1. 在application.html.erb中: <main class="<%= controller.controller_name%>"> 的controller.controller_name是怎么理解?

查api:ActionController::Metal中的实例方法controller_name,

def controller_name

self.class.controller_name   #=> 里面调用同名类方法

end

思考:应用模版是根据请求的controller来渲染的,所以这里的controller应该是products.

尝试:在products/index.html.erb中,输出 <h1><%= controller %></h1>得到:实例化的对象#<ProductsController:0x00007fafcc72d070>,所以它的类是ProductsController,然后调用同名类方法,看源码,就是用正则表达式返回string。

def self.controller_name
@controller_name ||= name.demodulize.sub(/Controller$/, "").underscore
end 

解析: ProductsController.name => "ProductsController"

"ProductsController"  => 去掉继承的父类字符,还是 "ProductsController"

然后调用sub()把最后的字符串,替换为空。 => "Product"

再用underscore(),在大写字符前加下划线,然后改成小写 => "product"

结论: <main class="<%= controller.controller_name%>">相当于<main class="product">,调用css样式,对应在products.scss


ActionView::Helpers::SanitizeHelper(消毒,净化)

The SanitizeHelper module provides a set of methods for clean text of undesired HTML elements. These helper methods extend Action View making them callable within your template files. 4个方法。

sanitize(html, options = {}) ,可以加白名单


scss:用于编译成html认识的css (详细)

li {

...

      &::after {
        clear:both;
        content: " ";
        display: block;
      }

}

complied:

li {...}

li::after{...}

::after是psesudo element 一般用于在某个元素后面添加content:"xxx"内容,这里应该是用在li的循环在li之间加一个空行。

The ampersand & in SASS pulls in the parent selector when it compiles to CSS.

什么是css伪元素A CSS pseudo-element is a keyword added to a selector that lets you style a specific part of the selected element(s). For example, ::first-line can be used to change the font of the first line of a paragraph

/* The first line of every <p> element. */ 
p::first-line { color: blue; text-transform: uppercase; }

Responsive Web Design - Media Queries

Media query is a CSS technique introduced in CSS3.

It uses the @media rule to include a block of CSS properties only if a certain condition is true.

 
Desktop
Tablet

Phone


 

勘误《Rails5敏捷开发》:cache  P115 缓存局部结果

缺少一段翻译,和关键的一行代码:5.1版原文如下:

As far as verifying that this works is concerned, you’re going to get some insight into the work the server is doing behind the scenes. Go back to your server window and watch what happens when you refresh the page. The first time you load the page, you should see some SQL that is loading the products like Product Load (0.2ms) SELECT "products".* FROM "products" ORDER BY "products"."title" ASC. When you refresh the page again, it will still work, but you won’t see that SQL run. You should see some SQL that Rails runs to check if its cache is outdated, like so: SELECT COUNT(*) AS "size", MAX("products"."updated_at") AS timestamp FROM "products".
If you still aren’t convinced, you can add a configuration option to config/environments/development.rb called enable_fragment_cache_logging, like so:
​ ​# Enable/disable caching. By default caching is disabled.​
​ ​if​ Rails.root.join(​'tmp/caching-dev.txt'​).exist?
»   config.action_controller.enable_fragment_cache_logging = ​true​
​   config.action_controller.perform_caching = ​true​
You’ll need to restart your server for this to take effect, but after doing that, you should see log messages that look like this:
Read fragment views/products/4-20180409121532794883/382d59eb4358e2ff3dde9ec3a35ca386 (0.0ms)
Write fragment views/products/4-20180409121532794883/382d59eb4358e2ff3dde9ec3a35ca386 (0.0ms)
Write fragment views/products/query-b41f6fbd1a3876c26c349b7e6dd13d56-3-20180409121532797255/382d59eb4358e2ff3dde9ec3a35ca386 (0.0ms)

⚠️: 这篇博客有详细的案例讲解HTTP cache, fragment cache:

rails默认提供fragment caching。

action caching和page caching需要手动设置:

增加2个gem:actionpack-page_caching和actionpack-action_caching 具体做法需要看文档的连接。

默认情况下,缓存只在生产环境启动,如果想在本地启动缓存,需要:

在config/environments/*.rb中一般是developemnt.rb中:

config.action_controller.enable_fragment_cache_logging = ​true​

如代码所写,缓存只影响action controller,对底层缓存无影响。

片段缓存:

“片段缓存把视图逻辑的一部分放在 cache 块中,下次请求使用缓存存储器中的副本伺服。”

首次访问这个页面时,Rails会创建 一个时间戳(对象的id加updated_at属性),如果updated_at变化了则生成新的键然后写入一个新的缓存。

cache_if/cache_unless方法可以用于特定的条件。

示例:集合缓存,一次性缓存,速度更快。

<%= render partial:'products/product', collection:@products, cache: true %>

示例:片段缓存,

<% @products.each do |product| %>

  <% cache product do %>
    <%= render product %>
  <% end %>
<% end %> 

rails dev:cache 在开发/测试环境打开/关闭缓存

在关联的模型上,如果视图有嵌套,在belongs_to 后加,touch:true,同步判断缓存是否失效。

有时,可能想把缓存的片段嵌套在其他缓存的片段里。这叫俄罗斯套娃缓存(Russian doll caching)。
俄罗斯套娃缓存的优点是,更新单个商品后,重新生成外层片段时,其他内存片段可以复用。

如果缓存的文件对应的记录的 updated_at 属性值变了,缓存的文件失效。但是,内层嵌套的片段不失效。

对下面的视图来说:

<% cache product do %>
  <%= render product.games %>
<% end %>

而它渲染这个视图:


<% cache game do %>
  <%= render game %>
<% end %>”
 

如果game的任何一个属性变了,updated_at 的值会设为当前时间,因此缓存失效。然而,project对象的 updated_at 属性不变,因此它的缓存不失效,从而导致应用伺服过期的数据。为了解决这个问题,可以使用 touch
方法把模型绑在一起:

class Product < ApplicationRecord
has_many :games
end
class Game < ApplicationRecord
  belongs_to :product, touch: true
end 
这样就同步失效了。目的是让

管理依赖:有时候对需要处理自定义的helper methods,要自定义缓存依赖.

比如自定义的集合:
render @project.documents.where(published: true)
需要改为标准格式:
render partial: "documents/document", collection: @project.documents
  .where(published: true), cache:true

Explicit dependency
External dependency
这两个没有弄明白。http://guides.rubyonrails.org/caching_with_rails.html#shared-partial-caching


底层缓存:

缓存特定的值或者query结果。使用Rails.cache.fetch方法 ,详细用法看api.

ActiveSupport::Cache::Store可以储存任何可串联的Ruby对象。

基本的缓存方法:

fetchwritereadexist?, and delete

keys会被转化为string.

cache = ActiveSupport::Cache::MemoryStore.new

cache.write("city", "Duckburgh")

cache.read("city")  #=> "Duckburgh"

fetch(name, options = nil)

使用给定的key从缓存取数据。如果有对应的数据,返回这个数据。

如果没有对应的数据,返回nil。

如果一个block被传入, key先在缓存中找对应数据,如果找不到,则把block中的数据作为这个key的数据写入缓存,并返回block中的数据。

option选择有多个,如expires_in: 12.hours 在12小时后缓存到期.  namespace则用于创建命名空间防止与其他应用共用一个缓存存储器。

下面是个Product模型,有个实例方法,在竞争网站查找某个商品的价格。

class Product < ApplicationRecord
  def competing_price
    Rails.cache.fetch("#{cache_key}/competing_price", expires_in: 12.hours) do
      Competitor::API.find_price(id)
    end
  end
end 

SQL缓存

Rails提供的功能,如果在同一请求中遇到相同的查询结果,rails会使用缓存的结果。⚠️的是SQL缓存机制只在一个动作内有效,如果这个动作结束,缓存也就销毁了。如果想持久储存查询结果,可以使用

4-10 辅助方法controll_name,;SanitizeHelper; 伪元素和scss中的&, @Media; cache介绍。的更多相关文章

  1. MVC中使用内建的HTML辅助方法产生表单元素提交表单与button按钮事件的陷阱

    网站模板页有个登陆的退出按钮,当点击时跳转到登陆页面. <button onclick="logout()" >退出</button> $("#l ...

  2. 使用::befor和::after伪元素在网站中添加图标

    css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-letter,: ...

  3. 深入理解脚本化CSS系列第六篇——脚本化伪元素的6种方法

    × 目录 [1]动态样式 [2]CSS类[3]setAttribute()[4]CSSRule对象添加[5]空样式覆盖[6]CSSRule对象删除 前面的话 我们可以通过计算样式来读取伪元素的样式信息 ...

  4. 使用JS控制伪元素的几种方法

    一. 缘由: 本文源于在OSC社区中,有人提问如何用jq获取伪元素.我第一想法是强大的CSS Query应该可以获取伪元素吧. 然而事实上,CSS Query并不能.即我们不能通过$(":b ...

  5. 《ASP.NET MVC高级编程(4版)》读书笔记(5)表单和HTML辅助方法

    5.1 表单使用 5.1.1 action 和 method 特性 <form action="/Home/Index">     <input name=&qu ...

  6. ASP.NET MVC3学习心得-----表单和HTML辅助方法

    5.1表单的使用 5.1.1  action和method的特性 表单是包含输入元素的容器,包含按钮.复选框.文本框等元素,表单的这些输入元素使得用户能够向页面中输入信息,并把输入信息提交给服务器.A ...

  7. asp.net mvc 3.0 知识点整理 ----- (3).HtmlHelper(Html 辅助方法)介绍

    在View视图中,Html的类型是System.Web.Mvc.HtmlHelper<T>, 所有的辅助方法都需要和ModelState交互.那么,ModelState是什么呢?它是模型绑 ...

  8. css3 伪元素和伪类选择器详解

    转自脚本之家:http://www.jb51.net/css/213779.html 无论是伪类还是伪元素,都属于CSS选择器的范畴.所以它们的定义可以在CSS标准的选择器章节找到.分别是 CSS2. ...

  9. 【CSS进阶】伪元素的妙用2 - 多列均匀布局及title属性效果

    最近无论是工作还是自我学习提升都很忙,面对长篇大论的博文总是心有余而力不足,但又不断的接触学习到零碎的但是很有意义的知识点,很想分享给大家,所以本篇可能会很短. 本篇接我另一篇讲述 CSS 伪元素的文 ...

随机推荐

  1. ASP.NET控件--DropDownList

      设置默认值:DropDownList1.Items[i].Selected=true;绑定:DropDownList1.DataSource = dataSet.Tables["Tabl ...

  2. 论文笔记:Emotion Recognition From Speech With Recurrent Neural Networks

    动机(Motivation) 在自动语音识别(Automated Speech Recognition, ASR)中,只是把语音内容转成文字,但是人们对话过程中除了文本还有其它重要的信息,比如语调,情 ...

  3. mysql索引使用策略及优化

    原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 索引使用策略及优化 MySQL的优化主要分为结构优化(Schem ...

  4. python webdriver 从无到有搭建数据驱动自动化测试框架的步骤和总结

    一步一步搭建数据驱动测试框架的过程和总结 跟吴老学了搭建自动化数据驱动的框架后,我在自己练习的时候,尝试从简单的程序进行一点一点的扩展和优化,到实现这个数据驱动的框架. 先说一下搭建自动化测试框架的目 ...

  5. Jsoup解析网页html

    Jsoup解析网页html 解析网页demo: 利用Jsoup获取截图中的数据信息: html代码片段: <!-- 当前基金档案\计算\定投\开户 start --> <div cl ...

  6. Jsp获取Java的重定向赋值(String)

    Jsp获取Java的重定向赋值(String) Java代码片段: //传递String request.setAttribute("msg", msg); //重定向 reque ...

  7. MVC 扩展RadioButtonListFor和CheckBoxListFor

    学习MVC时候前端通常会用到HtmlHelper,使得前端编码简便很多.我们可能会经常用到htmlHelper中一些的EditorFor,LabelFor,ValiationMessageFor, 发 ...

  8. 基于qml创建最简单的图像处理程序(2)-使用c++&qml进行图像处理

     <基于qml创建最简单的图像处理程序>系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面http://www.cnblogs.com/jsxyhelu/p/8 ...

  9. 20145317彭垚《网络对抗》Exp6 信息搜集与漏洞扫描

    20145317彭垚<网络对抗>Exp6 信息搜集与漏洞扫描 问题回答 1.哪些组织负责DNS,IP的管理? DNS域名服务器:绝大多数在欧洲和北美洲,中国仅拥有镜像服务器. 全球一共有5 ...

  10. 关于STM32 MDK中USE_STDPERIPH_DRIVER问题的解释

    初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题.出现如下警告或错误提示: warning: #223-D: function &qu ...