source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.4.0' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.2.3' # Use sqlite3 as the database for Active Record gem 'sqlite3' # Use Puma as the app server gem 'puma', '~> 3.11' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'mini_racer', platforms: :ruby # Use CoffeeScript for .coffee assets and views gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.5' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use ActiveStorage variant # gem 'mini_magick', '~> 4.8' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', '>= 1.1.0', require: false group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. gem 'web-console', '>= 3.3.0' gem 'listen', '>= 3.0.5', '< 3.2' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end group :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '>= 2.15' gem 'selenium-webdriver' # Easy installation and use of chromedriver to run system tests with Chrome gem 'chromedriver-helper' end group :test do gem "rails-controller-testing", '1.0.2' gem "minitest-reporters", '1.1.14' gem "guard", '2.13.0' gem "guard-minitest", '2.4.4' end group :production do gem 'pg', '0.20.0' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
bundle install --without production # 添加 bundle update # 修改
class ApplicationController < ActionController::Base def hello render html: "hello, world!" end end
class ApplicationController < ActionController::Base def hello render html: "hello, world!" # 設置根路由 end end
下面咱們要使用前面所說的用來生成腳手架的 generate 命令生成一個控制器。既然這個控制器用來處理靜態頁面, 那就把它命名爲 StaticPages 吧。能夠看出, 控制器的名字使用駝峯式命名法。咱們計劃建立「首頁」、「幫助」頁面和「關於」頁面,對應的動做名分別爲 home,help 和 about 。 generate 命令能夠接收一個可選的參數列表, 指定要建立的動做。咱們將在命令行中指定 home 和 help 動做,故意不指定 about 動做, 以後再介紹怎麼添加。生成 StaticPages 控制器的命令以下所示。html
rails generate controller StaticPages home help
rails generate 能夠簡寫成 rails g 。除此以外,Rails 還提供了幾個命令的簡寫形式, 往下瞧↓git
再來點(撤銷操做):程序員
即便再當心, 在開發 Rails 應用的過程當中也可能會犯錯。幸虧 Rails 提供了一些工具可以幫助咱們還原操做。 舉例來講, 一個常見的狀況是更改控制器的名字, 這時你得刪除生成的文件。生成控制器時, 除了控制器文件自己以外, Rails 還會生成不少其餘文件。撤銷生成的文件不只僅要刪除控制器文件, 還要刪除很多輔助文件。 (前面咱們也能看到, rails generate 命令還會自動修改routes.rb 文件, 所以咱們也想自動撤銷這些修改。)在 Rails 中, 可使用 rails destroy 命令完成撤銷操做。通常來講, 下面這兩個命令是相互抵消的: $ rails generate controller StaticPages home help $ rails destroy controller StaticPages home help 接下來的內容中會使用下面的命令生成模型: $ rails generate model User name:string email:string 這個操做可使用下面的命令撤銷: $ rails destroy model User (這裏,咱們能夠省略命令行中其他的參數。之後, 看看你可否發現爲何能夠這樣作。)
對模型來講,還涉及到撤銷遷移。前面已經簡要介紹了遷移, 後面的內容會開始會深刻說明。遷移經過下面的命令改變數據庫的狀態: $ rails db:migrate 咱們可使用下面的命令撤銷前一個遷移操做: $ rails db:rollback
若是要回到最開始的狀態,可使用: $ rails db:migrate VERSION=0 你可能猜到了,把數字 0 換成其餘數字就會回到相應的版本,這些版本數字是按照遷移執行的順序排列的。
注意,在上面生成靜態頁面控制器的代碼中, 咱們傳入的控制器名使用駝峯式(由於像駱駝的雙峯同樣), 建立出的控制器文件名則是蛇底式。因此, 傳入「StaticPages」獲得的文件是 static_pages_controller.rb 。這只是一種約定。其實在命令行中也可使用蛇底式: $ rails generate controller static_pages ...這個命令也會生成名爲 static_pages_controller.rb 的控制器文件。由於 Ruby 的類名使用駝峯式, 因此提到控制器時我會使用駝峯式, 不過這是個人我的選擇。(由於 Ruby 文件名通常使用蛇底式, 因此 Rails 生成器使用 underscore 方法把駝峯式轉換成蛇底式。)github
收!web
注:醜陋無比的頁面就出來了redis
打開文件:app/views/static_pages/home.html.erbspring
打開文件:app/views/static_pages/help.html.erbsql
注:嘛也沒有,固然醜了(本身稍微改改,試一試效果)chrome
咱們建立並修改了「首頁」和「幫助」頁面的內容,下面要添加「關於」頁面。作這樣的改動時, 最好編寫自動化測試, 確認實現的方法是否正確。對開發的應用來講, 咱們編寫的測試組件有兩個做用: 其一, 做爲一種安全防禦措施; 其二, 做爲源碼的文檔。雖然要編寫額外的代碼, 可是若是方法得當, 測試能協助咱們快速開發, 由於有了測試以後, 查找問題所用的時間會變少。不過, 咱們要善於編寫測試才行, 因此要儘早開始練習。數據庫
幾乎每一個 Rails 開發者都認同測試是好習慣, 但具體的做法多種多樣。最近有一場針對測試驅動開發(Test-Driven Development, 簡稱 TDD)的爭論, 十分熱鬧。TDD 是一種測試技術, 程序員要先編寫失敗的測試, 而後再編寫應用代碼, 讓測試經過。而咱們將採用一種輕量級, 符合直覺的測試方案, 只在適當的時候才使用 TDD, 而不嚴格遵照 TDD 理念。
咱們主要編寫的測試類型是控制器測試、模型測試和集成測試。集成測試的做用特別大,它能模擬用戶在瀏覽器中與應用交互的過程,最終會成爲咱們的主要關注對象,不過控制器測試更容易上手。
如今咱們要在這個應用中添加一個「關於」頁面。咱們將看到,這個測試很短,因此按照上圖中的指導方針,咱們先編寫測試, 而後使用失敗的測試驅動咱們編寫應用代碼。
由於執行 rails generate controller 命令時自動生成了一個測試文件,咱們能夠從這個文件入手:
打開文件:test/controllers/static_pages_controller_test.rb(默認爲 StaticPages 控制器生成的測試 GREEN)
注:如今無需理解詳細的句法, 不過能夠看出, 其中有兩個測試, 對應咱們在命令行中傳入的兩個動做。各個測試先訪問 URL, 而後(經過斷言)確認獲得的是成功響應。其中, get 表示測試指望這兩個頁面是普通的網頁, 能夠經過 GET 請求訪問; :success 響應(表示 200 OK)是對 HTTP 響應碼的抽象表示。也就是說,下面這個測試的意思是: 爲了測試首頁, 向 StaticPages 控制器中 home 動做對應的URL 發起 GET 請求,確認獲得的是表示成功的響應碼。
執行命令:
注:與預期同樣,一開始測試組件能夠經過(GREEN)。
咱們在上文中說過, 測試驅動開發流程是先編寫一個失敗測試, 而後編寫應用代碼讓測試經過, 最後再根據須要重構代碼。由於不少測試工具都使用紅色表示失敗的測試, 使用綠色表示經過的測試, 因此這個流程有時也叫「遇紅-變綠-重構」循環。這一節咱們先完成這個循環的第一步, 編寫一個失敗測試, 即「遇紅」。
打開文件:test/controllers/static_pages_controller_test.rb(「關於」頁面的測試 RED)
執行命令:
注:果真有一個errors吧
如今有了一個失敗測試(RED), 咱們要在這個失敗測試的錯誤消息指示下, 讓測試經過(GREEN), 也就是要實現一個能夠訪問的「關於」頁面。
根據它給出的錯誤提示:
注:這個錯誤消息說,未定義獲取「關於」頁面地址的 Rails 代碼,其實就是提示咱們要在路由文件中添加一個規則。
添加路由:
打開文件:config/routes.rb(添加 about 路由 RED)
而後在次運行測試,仍是錯誤,但提示已經改變了
注:這個錯誤消息的意思是, StaticPages 控制器缺乏 about 動做。
繼續修改:
打開文件:app/controllers/static_pages_controller.rb(在 StaticPages 控制器中添加 about 動做 RED)
繼續測試,仍是錯誤,但提示又改變了
注:這代表沒有模板。在 Rails 中, 模板就是視圖。home 動做對應的視圖是 home.html.erb , 保存在app/views/static_pages 目錄中。因此, 咱們要在這個目錄中新建一個文件, 並且要命名爲about.html.erb 。
新建文件:
$ touch app/views/static_pages/about.html.erb
注:Liunx 命令,不懂百度,再不懂右鍵新建文件
打開文件:app/views/static_pages/about.html.erb(「關於」頁面的內容 GREEN)
接着測,哎成功了!
注:errors是0了,錯誤沒了,開心^v^
看看頁面:
注:雖然醜,可是湊活着看吧
如今測試已經變綠, 咱們能夠自信地盡情重構了。開發應用時, 代碼常常會「變味」(意思是代碼會變得醜陋、囉嗦,有大量重複)。電腦不會在乎, 可是人類會, 因此常常重構, 把代碼變簡潔一些是很重要的事情。咱們的演示應用如今還很小, 沒什麼可重構的, 不過代碼無時無刻不在變味, 因此待會就將開始重構。
。。。
有點累了,歇歇,待會繼續