在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Ruby/ 第六章 Rails 的配置及部署
寫在后面
寫在前面
第六章 Rails 的配置及部署
第四章 Rails 中的模型
4.4 模型中的校驗(Validates)
1.3 用戶界面(UI)設(shè)計
6.5 生產(chǎn)環(huán)境部署
3.2 表單
4.3 模型中的關(guān)聯(lián)關(guān)系(Relations)
4.5 模型中的回調(diào)(Callback)
第五章 Rails 中的控制器
4.2 深入模型查詢
5.2 控制器中的方法
6.2 緩存
3.4 模板引擎的使用
6.4 I18n
第一章 Ruby on Rails 概述
6.6 常用 Gem
1.2 Rails 文件簡介
2.2 REST 架構(gòu)
2.3 深入路由(routes)
第三章 Rails 中的視圖
6.3 異步任務(wù)及郵件發(fā)送
第二章 Rails 中的資源
3.3 視圖中的 AJAX 交互

第六章 Rails 的配置及部署

課程概要:

本課程講解 Rails 中 Assets 管理,異步任務(wù)及郵件發(fā)送,緩存,多語言包,以及如何在服務(wù)器中部署。

知識點:

  1. Assets 管理
  2. 緩存及緩存服務(wù)
  3. 異步任務(wù)及郵件發(fā)送
  4. I18n
  5. 生產(chǎn)環(huán)境部署
  6. 常用 Gem 排行

課程背景

在 Rails 上線前,需要做好一些配置工作,并且實現(xiàn)常見的商用功能,如郵件發(fā)送,語言包,快捷部署等,同時要了解如何在 linux 服務(wù)器上部署 Rails 程序。

6.1 Assets 管理

概要:

本課時講解如何管理 Rails 中的 css,js 等靜態(tài)文件。

知識點:

  1. assets 編譯
  2. 靜態(tài)文件
  3. cdn

正文

當(dāng)?shù)谝淮斡?production 運行 Rails 時(rails s -e production),很可能提示找不到資源:

http://wiki.jikexueyuan.com/project/rails-practice/images/chapter_6/1.png" alt="" />

因為我們還沒有 編譯 這些靜態(tài)資源,說編譯是因為 Rails 默認(rèn)使用了 sprockets-rails 這個 gem 來管理 Assets 文件。

6.1.1 Assets 管理

Rails 的 Assets 包括已經(jīng)看到的 stylesheets,javascript 和 images,我們還可以增加 fonts。sprockets-rails 提供了幾個管理這些資源的 Rake 任務(wù)。其中最常用的是 rake assets:precompile。它的含義是,編譯所有在 config.assets.precompile 中定義的資源。

Rails 默認(rèn)加載 app/assets, lib/assetsvendor/assets 中的文件到 precompile 路徑中。我們引用這些資源文件的文件,叫 manifest file,可以理解為白名單。這里有兩個引用命令:

app/assets/styleshetts/application.css

*= require_self
*= require_tree .

這是一種簡單的引用,require_self 會先加載自身定義的內(nèi)容,然后加載其他所有目錄下的文件,也就是 require_tree . 中可以找到的文件。但是,我們引用的是 bootstrap 文件,它有變量文件,而 require_tree 命令不一定會優(yōu)先編譯這個變量文件,所以會出現(xiàn):

Less::ParseError: variable @navbar-default-bg is undefined

這樣的錯誤。而且當(dāng)項目的 assets 文件越來越多,引用的各種 sass 文件和 less 文件存在互相覆蓋的時候,require_tree 會讓這種引用雜亂,且文件臃腫龐大。

這時我們可以明確引用的文件,比如:

 *= require_self [1]
 *= require simplex/loader
 *= require simplex/bootswatch
 *= require bootstrap_and_overrides

如果我們在該文件里不寫其他 css,可以把 [1] 去掉。

如果我們在 application.css 中寫了一些 css,又 require 了其他文件,如果不使用 require_self,編譯文件中我們寫的 css 不是出現(xiàn)在頂部而可能出現(xiàn)在底部。require_self 會保持編譯結(jié)果順序和引用順序相同。

這樣運行該命令,會把這些資源編譯到 public/assets 目錄下。那么,其他沒有沒有在此被引入,而也要使用的文件,該如何被編譯呢?

Rails 4 將 assets 的配置文件單獨放置在 config/initializers/assets.rb 中:

Rails.application.config.assets.precompile += %w( products.js )
Rails.application.config.assets.precompile += %w( cerulean.js cerulean.css )

products.js 文件中定義了兩個方法,它只在一個頁面上使用,就沒必要編譯到整體文件里,只要在需要它的頁面引用即可:

app/views/products/index.html.erb

<%= javascript_include_tag "products" %>

總結(jié)一下,使用 白名單加載的 assets 文件,可以認(rèn)為是 “編譯+合并” 模式,這適合全局都使用的css 和 js。單獨寫入 config.assets.precompile 的文件是局部引用。

6.1.2 使用字體

因為我們把 bootstrap 中定義的變量放到了 assets 下,所以需要單獨引用 bootstrap 3 中使用的 Glyphicons 字體:

@font-face {
   font-family: 'Glyphicons Halflings';
   src: font-url('glyphicons-halflings-regular.eot');
   src: font-url('glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),
      font-url('glyphicons-halflings-regular.woff') format('woff'),
      font-url('glyphicons-halflings-regular.ttf') format('truetype'),
      font-url('glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
}

如果不做任何修改,則不必再次引用,gem 會自動把它們包含進來。

如果使用新的字體或圖標(biāo),需要把新字體文件放到 assets/fonts 中,然后定義:

@font-face {
  font-family: 'Trajan Pro';
  font-style: normal;
  src: font-url('trajan_pro/trajan_pro.woff');
  src: font-url('trajan_pro/trajan_pro.eot?#iefix') format('embedded-opentype'),
    font-url('trajan_pro/trajan_pro.woff') format('woff'),
    font-url('trajan_pro/trajan_pro.ttf') format('truetype'),
    font-url('trajan_pro/trajan_pro.svg#Regular') format('svg');
  font-weight: normal;
  font-style: normal;
}

這是一款購買的商業(yè)字體,引用的時候:

<font face="Trajan Pro"><%= product.name %></font>

6.1.3 CDN

如果我們不引用編譯的文件,直接使用 application.jsapplication.css 不可以么?這在開發(fā)環(huán)境下自然沒問題,但是在產(chǎn)品環(huán)境下,尤其遇到緩存和 cdn 時,會造成加載緩慢,無法及時清理過期時間的問題。

首先,Rails 默認(rèn)啟用了 assets 的 digest 選項,這樣編譯文件的時候,會帶有 md5 字符,形象的叫做 指紋。當(dāng)我們修改內(nèi)容之后,其該值會變動,生成新的文件名,并且編譯最新的文件。如果我們用 nginx 來作為 web server,可以針對這種文件設(shè)置緩存,如果使用外部 cdn,可以把最新的文件發(fā)布到 cdn 中(回源模式會自動從服務(wù)器讀取,無需發(fā)布)。

在 nginx 的配置:

location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;

  add_header ETag "";
  break;
}

在產(chǎn)品環(huán)境使用 cdn 時,需要更改配置:

config.action_controller.asset_host = "http://cdn.domain.com"

當(dāng)使用 xxx_url 這個 routes helper 時,會自動帶上 cdn 的地址。