您好,登錄后才能下訂單哦!
本篇內容主要講解“Rails、MVC及最常用的Rails命令有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Rails、MVC及最常用的Rails命令有哪些”吧!
Rails是什么?
Rails是一種web應用框架。根據模型-視圖-控制器(MVC)模式,它包括了創建數據庫支持的web應用程序時所需的所有內容。MVC將應用分為三層:模型、視圖和控制器,每一層都有特定任務。
模型-視圖-控制器(MVC)結構示意圖
模型層
模型層代表領域模型(如Account、Product、Person、Post等),概述應用程序中特有的業務邏輯。
在Rails中,數據庫支持的模型類源于 ActiveRecord::Base。Active Record支持用戶將數據庫行的數據表示為對象,并使用業務邏輯方法修飾這些數據對象。大多數Rails模型由數據庫支撐,模型也可以是Ruby普通類或實現由 Active Model模塊提供的一組接口的Ruby類。
控制層
控制層的功能在于處理傳入的HTTP請求以及給出適當響應。通常這一層意味著返回HTML,但Rails控制器還可以生成XML、JSON、PDF、移動專用視圖及其他格式。
控制器加載和操作模型,并呈現視圖模板,以便生成適當的HTTP響應。在Rails中,傳入要求由Action Dispatch發送至相應控制器,控制類來自 ActionController::Base。Action Dispatch和Action Controller一起綁定于Action Pack中。
圖源:unsplash
視圖層
視圖層由“模板”組成,主要負責提供應用程序資源的適當描述。模板可以有多種格式,但大多數視圖模板都是帶有內嵌Ruby代碼的HTML(ERB 文件)。視圖通常生成控制器響應,或生成電子郵件正文。在Rails中,視圖生成由Action View處理。
開發一款新型Rails應用
首先從頭構建一個應用程序,這步之前要確保系統內裝有Ruby、RubyGems和Bundler。打開終端導航到一個有權限創建文件的目錄。先要做的是安裝Rails并通過運行railsnew
要從頭開始創建只支持API的Rails,創建時--api應在Rails應用程序名稱之后:railsnew<my_app_name>
通過使用 --api 旗標,Rails能夠刪除許多默認功能和中間件(大多是涉及無用的瀏覽器)。控制器繼承ActionController::API而非ActionController::Base,生成器會跳過生成視圖。為只支持API的Rails構建設置資源無須作任何改變。
將所有所需gem添加至Gemfile中后開始運行bundle install。
初始化數據庫:rails db:create
運行Rails服務器:rails s
Rails生成
Rails團隊的首要目標是高效地構建核心應用程序功能。Rails系統擁有大量生成器,能幫助用戶完成一些手動作業。生成器除了節省時間,還有一些其他優點:
生成器能夠為應用程序測試套件設置基本規格。它們會為用戶提供一些基本例子而非編寫復雜的邏輯測試。
經設置,生成器的運行方式保持不變,這樣便能標準化代碼并幫助用戶更有效地開發,原因在于用戶不必過多擔心手寫代碼時可能會出現的拼寫、語法錯誤或其他相關漏洞。
生成器遵循Rails最佳操作,包括使用RESTful命名模式、刪除重復代碼、使用部分和許多其他最佳類型設計模式。
然而,某些生成器會創建相當多的代碼。如果不使用某個代碼,它就會造成應用程序代碼不必要的混亂,從而給以后的程序員帶來困擾。所以何時使用生成器最好呢?所有Rails生成器作為命令輸入終端,并遵循下列語法:
rails generate <name of generator> <options>--no-test-framework
--no-test-framework 是一個旗標,意在提醒生成器不要為新生成模型和控制器等創建任何測試。當用戶運行自己的Rails應用程序時則不需要旗標,這十分有助于快速建立測試套件。
為了提高效率,Rails將generate 方法簡化為g,因此上述CLI命令可以簡化為:
rails g <name of generator> <options>--no-test-framework
圖源:unsplash
下列是Rails提供的主要生成器。筆者將分別舉例說明:
遷移生成器
Rails有一組遵守規范的優質遷移生成器,能夠有效管理數據庫模式。繪制域模型后可以進行下一步。首先使用案例庫應用程序中的數據庫遷移并更新 painters 表。運用下列命令在表中添加一列,將其命名為portrait:
railsg migration add_portrait_to_painters portrait:string --no-test-framework
終端顯示創建了遷移文件20200928055457_add_portrait_to_painters.rb.。由于遷移文件名不得重復,生成器會在文件名前加上時間戳。神奇的事情發生了——打開db/migrat 目錄中創建的文件,它現在應該是這樣:
class AddPortraitToPainters < ActiveRecord::Migration[6.0] def change add_column :painters, :portrait,:string end end
注意到生成器的作用了嗎?它自動感知到用戶想添加一個新的列,構建了add_column 方法調用。這是如何做到的?
實踐證明,命名遷移文件的方法至關重要。通過在名稱前加上add_文本,它向遷移生成器發送了一個信號,即這種模式更改的目的是向表中添加一列/多列。
那么它是如何知道用戶想在哪個表上添加的呢?它將_painters 文本附加到遷移名稱的末尾,以此告訴Rails用戶想更改的表格是 painters 表。最后,通過在命令末尾添加 portrait:string 文本告知生成器新的列的名稱為portrait,數據類型為 string。
用戶可以通過運行rails db:migrate 更新數據庫模式,該模式也會反映出這次變更。
刪除列則可以運行另外一個遷移:
railsg migration remove_portrait_from_painters portrait:string
如果打開此遷移文件則會看到下列代碼:
class RemovePortraitToPainters < ActiveRecord::Migration[6.0] def change remove_column :painters, :portrait,:string end end
運行rails db:migrate 后,模式也會得到更新。當需要運行任何未決遷移時可以使用這一命令。
railsdb:migrate:reset:它會刪除數據庫信息,在新的數據庫運行遷移并重新加載種子數據。
railsdb:seed:將數據從文件:db/seeds.rb加載到數據庫中。這種方法對用Rails項目所需的初始數據填充數據庫十分有用。
railsdb:rollback:回滾上次執行的遷移。它會撤銷上一次遷移,接著用戶便可編輯文件并重新運行 rails db:migrate 。注意,進行過程中謹慎使用這一命令,因為它極具破壞性,很有可能造成數據丟失。運行時一定確保自己完全清楚運行后的結果。
模型生成器
這是一種經常使用的生成器類型。它適用于編寫創建模型和關聯數據庫表所需的核心代碼,且不會使應用程序過于復雜。一般來說需要模型名稱(單數和首字母大寫)和模型參數。
接下來為帶有 name、bio和 genre列的Painter 應用程序添加一個新模型,可以通過以下CLI命令使用模型生成器:
railsg model Painter name:string genre:string bio:text
如果數據類型為字符串,則不需要在列名后指定類型,因為它是默認數據類型。因此如下:
railsg model Painter name genre bio:text
因其水平較高,這一步已經創建了:
添加一個表格和name、genre和 bio列的數據庫遷移
繼承ApplicationRecord (自Rails 5起)的模型文件
我們接下來創建另一個屬于Painter的模型Painting:
railsg model Painting name image painter:belongs_to
切記首先生成具有has_many宏命令的代碼;在運行遷移時只有帶有belongs_to 的代碼有用,否則會得到錯誤代碼:
ActiveRecord::StatementInvalid:PG::UndefinedTable: ERROR: relation "<some table name>" doesnot exist
運行這一生成器會創建出一個遷移文件和 Painter 和Painting模型。這一特定的生成器創建了一些具有單命令的不同的功能,且僅用最簡單的代碼就生成出來。接著轉向自己的模型,確保建立適當關系(has_many, belongs_to)。
下一步是創建一個遷移:rails db:create 和 rails db:migrate來遷移表格。用戶可以在控制臺中測試連接,只需要運行rails c并創建一些新的例子,不論正確與否都可以測試驗證;接下來測試關聯度(如Painter.all.first.painting能夠檢查第一個painter的painting)
圖源:unsplash
控制生成器
運行rails g controller 命令會提供一個控制文件(用于添加適當操作)和相應的視圖文件夾:
railsg controller paintings
資源生成器
如果用戶在在創建API過程中使用前端MVC架構,或只想手動創建視圖,resource生成器是編寫代碼的一個優選。創建Painting資源:
railsg resource Painting name image painter:belongs_to
因為沒有為name和image 編寫數據類型,因此默認情況下它是一個字符串。添加 painter:belongs_to 來指定兩個表格的關系,并在paintings表格中設置一列 painter_id。也可以使用 references編寫上述命令(結果一樣):
railsg resource Painting name image painter:references
這是為不同模型編寫相同命令的另一個例子:
railsg resource Answer content correct_answer:boolean question:belongs_to
憑借生成器,目前的應用程序擁有什么?
一個遷移文件,能夠在生成器中為傳遞給它的屬性創建一個新的數據庫表
繼承ApplicationRecord的模型文件(從Rails 5開始,見上述注意事項)
繼承了ApplicationController的控制器文件
不帶有視圖模板文件的視圖目錄
視圖helper文件
用于該控制器的特定JavaScripts的Coffeescript文件
用于控制器樣式的 scss文件
routes.rb文件內的完整資源調用
resource生成器是一種智能生成器,創建全功能資源所需的一些核心功能,同時不會導致過多代碼膨脹。
路由
圖源:unsplash
最后一項可能不太常見。通常resources:paintings被視作為一個“魔法”路由,它包含在應用程序中執行CRUD所需的全部RESTful路由。那么resources:paintings會轉化成什么?用濾波器運行 rake routes 會比較簡單,這樣就只會呈現paintings的路由:
rake routes | grep painting
resources自動創建每個路由并使其對控制器可用。打開paintings_controller.rb文件會很有趣:路由列表中出現的操作都不存在。它創建的代碼非常少,只需添加應用程序需要的功能。
Scaffold生成器
rails g scaffold User username:string
到此,相信大家對“Rails、MVC及最常用的Rails命令有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。