在线观看不卡亚洲电影_亚洲妓女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 中的資源,通過 scaffold 命令創(chuàng)建資源,并對資源文件的類型、REST 風格設(shè)計及路由文件進行講解,理解 Rails 如何在 REST 架構(gòu)下如何進行資源的管理。

知識點:

  1. scaffold 命令
  2. REST
  3. routes

課程背景

Rails 是 REST 風格的 web 開發(fā)框架,通過本課程的學習,可以理解 Rails 是如何通過對資源的管理,實現(xiàn) REST 架構(gòu)的。

2.1 應用 scaffold 命令創(chuàng)建資源

概要:

本課時詳細介紹 Rails 中的命令,以及使用 scaffold 命令創(chuàng)建的資源文件,如 erb 文件,測試文件,sass 文件等。

知識點:

  1. scaffold
  2. sass/scss
  3. coffeescript
  4. erb
  5. rspec

正文

2.1.1 rails 命令

上一節(jié),我們用 new 創(chuàng)建了一個 Rails 項目,并且使用了下面的命令,創(chuàng)建了商品(Product)這個資源:

% rails g scaffold product name price:decimal description:text

g 是 generate 的縮寫,Rails 還為我們提供了幾個類似的命令:

% rails -h
generate    生成資源文件 (簡寫 "g")
console     運行調(diào)試控制臺 (簡寫 "c")
server      運行 Rails 服務(wù) (簡寫 "s")
dbconsole   運行數(shù)據(jù)庫調(diào)試控制臺 (簡寫 "db")
new         創(chuàng)建新的 Rails 項目。 你也可以 "rails new ." 它會在當前目錄下創(chuàng)建
destroy     刪除 "generate" 創(chuàng)建的文件 (簡寫 "d")
plugin new  創(chuàng)建一個 plugin  
runner      在 Rails 環(huán)境下,執(zhí)行一段 Ruby 代碼

我們用 generate 可以創(chuàng)建資源,同樣也可以用 destroy 刪除這個資源,比如:

% rails destroy scaffold product

我們已經(jīng)使用 server 命令運行了項目,但是,有時候我們不一定要在 web 頁面上做操作,為了方便調(diào)試,我們可以已進入到互動終端,也就是 console 中:

% rails console
> Product.first
Product Load (0.2ms)  SELECT  "products".* FROM "products"  ORDER BY "products"."id" ASC LIMIT 1
 => nil
> exit

在 console 里,我們可以方便的操作數(shù)據(jù)庫,下一章我們會重點講解數(shù)據(jù)庫部分。

和 console 類似,dbconsole 可以進入到數(shù)據(jù)庫的互動終端里,具體的命令取決去使用的哪個數(shù)據(jù)庫,rails 只是為我們提供了一個方便的連接數(shù)據(jù)庫方式。

plugin 命令可以為一個獨立的功能創(chuàng)建專屬的代碼,并且存在與該 Rails 項目中,在 Rails 3 之后,越來越多的功能使用 gem 來實現(xiàn),plugin 較少使用了。

和 console 的交互式操作不同,runner 可以執(zhí)行一段代碼,相同的是,它們都擁有當前項目完整的 Rails 環(huán)境。我們可以使用執(zhí)行一個文件,比如:

% rails runner lib/somefile.rb

在這個 file 里,可以實現(xiàn)一些功能,這和 rake 的實現(xiàn)方式較接近。

2.1.2 scaffold 命令

回到我們經(jīng)常使用的 generate 命令,先查看幫助文檔:

% rails generate -h

我們看到,generate 可以創(chuàng)建很多類型的文件,比如 model,controller,assets 文件等,這些都是一個 Rails 資源所需要。我們可以分別執(zhí)行 generate 命令,也可以把它們一次都執(zhí)行,這就是 scaffold。

scaffold 的中文稱呼是 “腳手架”,個人覺得它不是很形象,如果稱它為“一大堆 generator(生成器) 的集合”,似乎形象很多。Rails 為我們提供了一些 generator,我們也可以編寫自己的 generator。

再來看看 scaffold 的語法結(jié)構(gòu):

% rails g scaffold [資源名] [屬性列表] [選項]

為了使我們的網(wǎng)店更接近實際應用,我們再增加一個資源:商品類型(Variant)

% rails g scaffold variants product_id:integer price:decimal{'8,2'} size

variants 是資源的名稱,它可以是單數(shù),我們創(chuàng)建商品時用的就是單數(shù)形式。屬性列表里,屬性名稱和屬性的類型,使用 : 來分開,默認的類型是 string,所以 color 的后面沒有聲明它是什么類型,那么它就是 string 類型。

當我們創(chuàng)建價格類型的時候,decimal 可以增加兩個具體參數(shù):precision 和 scale,每個數(shù)據(jù)庫的默認值是不同的,我們可以查看這里:

RMDB 的decimal 默認值

我們打開 config/routes.rb,可以看到這樣兩行代碼已經(jīng)添加了:

生成文件的時候,我們注意到這一行:

...
resources :products
resources :variants
...

這就是我們定義的資源。其實,我們說 URL 中的 R 就是這個資源 Resource 的意思。我們可以這樣理解 Rails:

Rails 是從管理資源開始的。

我們還可以配置 scaffold,讓它跳過一些不必要的文件,配置寫在 config/application.rb 中:

class Application < Rails::Application
  ...
  config.generators do |cfg|
    cfg.stylesheets     false
    cfg.javascripts     false
    cfg.helpers         false
  end

這樣,scaffold 命令就不再創(chuàng)建 helper,css,js 文件了。但在我們學習初期階段,先不這么做。

2.1.3 sass/scss

創(chuàng)建的文件中,我們看到了 .scss 的文件,其實,它是 sass 文件,一種 css 的預處理文件,它的后綴有兩種:.scss.sass。scss 語法更接近 css 本身,你可以直接粘貼 css 來使用。sass 語法更加簡潔,它去掉了 ;{} 這些符號,并且使用空格,作為語法縮進。

使用 sass,可以使用預定義變量,使用語法嵌套,代碼混入等多種編程風格的代碼,編寫 css,并且在編譯成 css 文件的過程中,還可以進行語法檢查。

sass 和 scss 寫法上的不同,可以在 http://sass-lang.com/guide (中文文檔)看到。

如果你想在兩種文件間轉(zhuǎn)換,可以使用這個命令:

# Convert Sass to SCSS
% sass-convert style.sass style.scss

# Convert SCSS to Sass
% sass-convert style.scss style.sass

SASS用法指南 一文里有更詳細的介紹。

Rails 默認使用的是 sass,這里是它 github 的地址,

在我們的 css 文件中,經(jīng)常會使用圖片文件,比如 background-image 屬性,但是我們的圖片是放在 assets 文件夾中的,我們可以有三種方式來使用圖片。

第一種,直接粘貼圖片地址,比如:

background-image: url("/assets/logo.png");

這是很不好的,它不能使用 digest 方式來使用圖片資源,也不夠靈活。

第二種,將圖片文件放到 public 下,比如:

background-image: url("/images/logo.png");

這需要我們在 public 下建立一個 images 文件夾來管理圖片文件,也不能使用 digest。

第三種,直接使用 sass-rails 提供的輔助方法

background-image: asset-url('logo.png');

當然,我也見到過第四種方法,使用 erb 來重構(gòu) sass,文件可能是這樣的,style.css.scss.erb,這樣就可以在 scss 里插入 erb 的語法:

background-image: url(<%= asset_path 'logo.png' %>);

在 Rails 里是可以這么寫的,它會先解析 erb 文件,再解析 sass 文件,生成 css。但是我不建議這么處理問題,在我們使用一個不熟悉的方法解決問題時,應該多耐心看一看它的文檔。不知道這里給出的眾多鏈接,大家是否查看了,他們都是對內(nèi)容很好的補充。

和 sass 一樣,Less 也是 css 的預編譯工具,如果你留意 bootstrap 的介紹,它的 css 文件就是用 less 編寫的。

2.1.4 coffeescript

.coffee 是 js 的預處理文件,它是用 coffeescript 編寫的。學習它很簡單,只要看看http://coffeescript.org/ 就可以了,中文在 http://coffee-script.org/。

scss 和 coffeescript 的目標,是讓代碼更簡潔,易維護。預處理還可以幫你檢查語法上的錯誤。

在我們安裝完 bootstrap 后,會給出一個 coffee 文件:

jQuery ->
  $("a[rel~=popover], .has-popover").popover()
  $("a[rel~=tooltip], .has-tooltip").tooltip()

2.1.5 erb

最后,我們說說 erb。

erb 是 Ruby 的標準庫(Standard Library)之一, 它允許是把 Ruby 代碼簽入到 html 中。

一個簡單的例子,我們進入到 irb 中:

% require "erb"
% name = "Ruby"
% ERB.new("My name is #{name}").result
=> "My name is Ruby"

好了,文件都介紹完了,我們看一下效果吧,我們使用下面的命令:

% rake db:migrate [1]
% rails s [2]
  • [1] 更新數(shù)據(jù)庫
  • [2] 啟動 Rails 服務(wù),s 是 server 的簡寫

訪問 http://localhost:3000/products,試試上面的按鈕,體驗一下如何增加,修改,刪除一個商品(Product)吧。

2.1.6 測試

除了上面介紹的,scaffold 還為我們添加了測試文件 test/models/product_test.rbtest/controllers/products_controller_test.rb

這里,Rails 默認使用的是 minitest,更多介紹可以看這里。我們也可以使用其他的測試框架,比如 Rspec。

我們可以修改 Gemfile

group :development, :test do
  gem 'rspec-rails'
end

運行 rspec 的 generator:

% rails generate rspec:install
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb

我們補上 Model 和 Controller 的測試文件:

rails generate rspec:model product
rails generate rspec:controller products

最后,我們在 Rails 項目文件夾中運行這個命令:

% rspec
**

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) ProductsController 
     # Not yet implemented
     # ./spec/controllers/products_controller_spec.rb:4

  2) Product add some examples to (or delete) /Users/liwei/Desktop/Rails_practice_p1_0/code/chapter_2/shop/spec/models/product_spec.rb
     # Not yet implemented
     # ./spec/models/product_spec.rb:4

Finished in 0.00058 seconds (files took 1.6 seconds to load)

我們看到測試文件已經(jīng)可以運行了,雖然我們還未給它寫一行測試用例(Test Case)。

在后面 MVC 開發(fā)的部分,我們會繼續(xù)添加它的代碼。Rspec 的代碼和文檔在這里:

https://github.com/rspec/rspec

讓 Rspec 集成到 Rails 中的方法是安裝 rspec-rails

group :development, :test do
  gem 'rspec-rails', '~> 3.0'
end

https://github.com/rspec/rspec-rails

下一節(jié),我們將深入 Rails 中,了解它的核心概念:REST。