成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

專攻難題:Rails、MVC及最常用的Rails命令

開發(fā) 前端
使用Rails可以專注解決困難部分,消減重復(fù)性工作。Rails命令十分神奇,但我們必須了解每個(gè)命令的功能和編寫過程。

本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)。

在使用Ruby編寫web應(yīng)用程序時(shí),創(chuàng)始人David HeinemeierHansson說,他只不過是將以往應(yīng)用程序的通用部分復(fù)制粘貼到新程序中。

包括他在內(nèi),所有程序員都喜歡解決難題。嘗試解決工作領(lǐng)域內(nèi)獨(dú)有難題的唯一方法,是構(gòu)建一個(gè)抽象層,并清除腦海中所有關(guān)于基礎(chǔ)web程序的細(xì)節(jié)。使用Rails可以專注解決困難部分,消減重復(fù)性工作。Rails命令十分神奇,但我們必須了解每個(gè)命令的功能和編寫過程。

[[349093]]

Rails是什么?

Rails是一種web應(yīng)用框架。根據(jù)模型-視圖-控制器(MVC)模式,它包括了創(chuàng)建數(shù)據(jù)庫支持的web應(yīng)用程序時(shí)所需的所有內(nèi)容。MVC將應(yīng)用分為三層:模型、視圖和控制器,每一層都有特定任務(wù)。

模型-視圖-控制器(MVC)結(jié)構(gòu)示意圖

模型層

模型層代表領(lǐng)域模型(如Account、Product、Person、Post等),概述應(yīng)用程序中特有的業(yè)務(wù)邏輯。

在Rails中,數(shù)據(jù)庫支持的模型類源于 ActiveRecord::Base。Active Record支持用戶將數(shù)據(jù)庫行的數(shù)據(jù)表示為對象,并使用業(yè)務(wù)邏輯方法修飾這些數(shù)據(jù)對象。大多數(shù)Rails模型由數(shù)據(jù)庫支撐,模型也可以是Ruby普通類或?qū)崿F(xiàn)由 Active Model模塊提供的一組接口的Ruby類。

控制層

控制層的功能在于處理傳入的HTTP請求以及給出適當(dāng)響應(yīng)。通常這一層意味著返回HTML,但Rails控制器還可以生成XML、JSON、PDF、移動專用視圖及其他格式。

控制器加載和操作模型,并呈現(xiàn)視圖模板,以便生成適當(dāng)?shù)腍TTP響應(yīng)。在Rails中,傳入要求由Action Dispatch發(fā)送至相應(yīng)控制器,控制類來自 ActionController::Base。Action Dispatch和Action Controller一起綁定于Action Pack中。

[[349095]]

圖源:unsplash

視圖層

視圖層由“模板”組成,主要負(fù)責(zé)提供應(yīng)用程序資源的適當(dāng)描述。模板可以有多種格式,但大多數(shù)視圖模板都是帶有內(nèi)嵌Ruby代碼的HTML(ERB 文件)。視圖通常生成控制器響應(yīng),或生成電子郵件正文。在Rails中,視圖生成由Action View處理。

開發(fā)一款新型Rails應(yīng)用

首先從頭構(gòu)建一個(gè)應(yīng)用程序,這步之前要確保系統(tǒng)內(nèi)裝有Ruby、RubyGems和Bundler。打開終端導(dǎo)航到一個(gè)有權(quán)限創(chuàng)建文件的目錄。先要做的是安裝Rails并通過運(yùn)行railsnew 命令構(gòu)建一個(gè)新型Rails應(yīng)用程序。

要從頭開始創(chuàng)建只支持API的Rails,創(chuàng)建時(shí)--api應(yīng)在Rails應(yīng)用程序名稱之后:railsnew<my_app_name>  --database=postgresql --api (使用Postgresql數(shù)據(jù)庫配置應(yīng)用程序更為容易,但別忘了在運(yùn)行命令前安裝這一數(shù)據(jù)庫)。例如:rails new Gallery --database=postgresql –api。

通過使用 --api 旗標(biāo),Rails能夠刪除許多默認(rèn)功能和中間件(大多是涉及無用的瀏覽器)??刂破骼^承ActionController::API而非ActionController::Base,生成器會跳過生成視圖。為只支持API的Rails構(gòu)建設(shè)置資源無須作任何改變。

將所有所需gem添加至Gemfile中后開始運(yùn)行bundle install。

  • 初始化數(shù)據(jù)庫:rails db:create
  • 運(yùn)行Rails服務(wù)器:rails s

Rails生成

Rails團(tuán)隊(duì)的首要目標(biāo)是高效地構(gòu)建核心應(yīng)用程序功能。Rails系統(tǒng)擁有大量生成器,能幫助用戶完成一些手動作業(yè)。生成器除了節(jié)省時(shí)間,還有一些其他優(yōu)點(diǎn):

  • 生成器能夠?yàn)閼?yīng)用程序測試套件設(shè)置基本規(guī)格。它們會為用戶提供一些基本例子而非編寫復(fù)雜的邏輯測試。
  • 經(jīng)設(shè)置,生成器的運(yùn)行方式保持不變,這樣便能標(biāo)準(zhǔn)化代碼并幫助用戶更有效地開發(fā),原因在于用戶不必過多擔(dān)心手寫代碼時(shí)可能會出現(xiàn)的拼寫、語法錯(cuò)誤或其他相關(guān)漏洞。
  • 生成器遵循Rails最佳操作,包括使用RESTful命名模式、刪除重復(fù)代碼、使用部分和許多其他最佳類型設(shè)計(jì)模式。

然而,某些生成器會創(chuàng)建相當(dāng)多的代碼。如果不使用某個(gè)代碼,它就會造成應(yīng)用程序代碼不必要的混亂,從而給以后的程序員帶來困擾。所以何時(shí)使用生成器最好呢?所有Rails生成器作為命令輸入終端,并遵循下列語法:

  1. rails generate <name of generator> <options>--no-test-framework 

--no-test-framework 是一個(gè)旗標(biāo),意在提醒生成器不要為新生成模型和控制器等創(chuàng)建任何測試。當(dāng)用戶運(yùn)行自己的Rails應(yīng)用程序時(shí)則不需要旗標(biāo),這十分有助于快速建立測試套件。

為了提高效率,Rails將generate 方法簡化為g,因此上述CLI命令可以簡化為:

  1. rails g <name of generator> <options>--no-test-framework 

[[349096]]

圖源:unsplash

下列是Rails提供的主要生成器。筆者將分別舉例說明:

遷移生成器

Rails有一組遵守規(guī)范的優(yōu)質(zhì)遷移生成器,能夠有效管理數(shù)據(jù)庫模式。繪制域模型后可以進(jìn)行下一步。首先使用案例庫應(yīng)用程序中的數(shù)據(jù)庫遷移并更新 painters 表。運(yùn)用下列命令在表中添加一列,將其命名為portrait:

  1. railsg migration add_portrait_to_painters portrait:string --no-test-framework 

終端顯示創(chuàng)建了遷移文件20200928055457_add_portrait_to_painters.rb.。由于遷移文件名不得重復(fù),生成器會在文件名前加上時(shí)間戳。神奇的事情發(fā)生了——打開db/migrat 目錄中創(chuàng)建的文件,它現(xiàn)在應(yīng)該是這樣:

  1. class AddPortraitToPainters < ActiveRecord::Migration[6.0] 
  2.    def change 
  3.      add_column :painters, :portrait,:string 
  4.    end 
  5. end 

注意到生成器的作用了嗎?它自動感知到用戶想添加一個(gè)新的列,構(gòu)建了add_column 方法調(diào)用。這是如何做到的?

實(shí)踐證明,命名遷移文件的方法至關(guān)重要。通過在名稱前加上add_文本,它向遷移生成器發(fā)送了一個(gè)信號,即這種模式更改的目的是向表中添加一列/多列。

那么它是如何知道用戶想在哪個(gè)表上添加的呢?它將_painters 文本附加到遷移名稱的末尾,以此告訴Rails用戶想更改的表格是 painters 表。最后,通過在命令末尾添加 portrait:string 文本告知生成器新的列的名稱為portrait,數(shù)據(jù)類型為 string。

用戶可以通過運(yùn)行rails db:migrate 更新數(shù)據(jù)庫模式,該模式也會反映出這次變更。

刪除列則可以運(yùn)行另外一個(gè)遷移:

  1. railsg migration remove_portrait_from_painters portrait:string 

如果打開此遷移文件則會看到下列代碼:

  1. class RemovePortraitToPainters < ActiveRecord::Migration[6.0] 
  2.    def change 
  3.      remove_column :painters, :portrait,:string 
  4.    end 
  5. end 

運(yùn)行rails db:migrate 后,模式也會得到更新。當(dāng)需要運(yùn)行任何未決遷移時(shí)可以使用這一命令。

  • railsdb:migrate:reset:它會刪除數(shù)據(jù)庫信息,在新的數(shù)據(jù)庫運(yùn)行遷移并重新加載種子數(shù)據(jù)。
  • railsdb:seed:將數(shù)據(jù)從文件:db/seeds.rb加載到數(shù)據(jù)庫中。這種方法對用Rails項(xiàng)目所需的初始數(shù)據(jù)填充數(shù)據(jù)庫十分有用。
  • railsdb:rollback:回滾上次執(zhí)行的遷移。它會撤銷上一次遷移,接著用戶便可編輯文件并重新運(yùn)行 rails db:migrate 。注意,進(jìn)行過程中謹(jǐn)慎使用這一命令,因?yàn)樗鼧O具破壞性,很有可能造成數(shù)據(jù)丟失。運(yùn)行時(shí)一定確保自己完全清楚運(yùn)行后的結(jié)果。

模型生成器

這是一種經(jīng)常使用的生成器類型。它適用于編寫創(chuàng)建模型和關(guān)聯(lián)數(shù)據(jù)庫表所需的核心代碼,且不會使應(yīng)用程序過于復(fù)雜。一般來說需要模型名稱(單數(shù)和首字母大寫)和模型參數(shù)。

接下來為帶有 name、bio和 genre列的Painter 應(yīng)用程序添加一個(gè)新模型,可以通過以下CLI命令使用模型生成器:

  1. railsg model Painter name:string genre:string bio:text 

如果數(shù)據(jù)類型為字符串,則不需要在列名后指定類型,因?yàn)樗悄J(rèn)數(shù)據(jù)類型。因此如下:

  1. railsg model Painter name genre bio:text 

因其水平較高,這一步已經(jīng)創(chuàng)建了:

  • 添加一個(gè)表格和name、genre和 bio列的數(shù)據(jù)庫遷移
  • 繼承ApplicationRecord (自Rails 5起)的模型文件

我們接下來創(chuàng)建另一個(gè)屬于Painter的模型Painting:

  1. railsg model Painting name image painter:belongs_to 

切記首先生成具有has_many宏命令的代碼;在運(yùn)行遷移時(shí)只有帶有belongs_to 的代碼有用,否則會得到錯(cuò)誤代碼:

  1. ActiveRecord::StatementInvalid:PG::UndefinedTable: ERROR: relation "<some table name>" doesnot exist 

運(yùn)行這一生成器會創(chuàng)建出一個(gè)遷移文件和 Painter 和Painting模型。這一特定的生成器創(chuàng)建了一些具有單命令的不同的功能,且僅用最簡單的代碼就生成出來。接著轉(zhuǎn)向自己的模型,確保建立適當(dāng)關(guān)系(has_many, belongs_to)。

下一步是創(chuàng)建一個(gè)遷移:rails db:create 和 rails db:migrate來遷移表格。用戶可以在控制臺中測試連接,只需要運(yùn)行rails c并創(chuàng)建一些新的例子,不論正確與否都可以測試驗(yàn)證;接下來測試關(guān)聯(lián)度(如Painter.all.first.painting能夠檢查第一個(gè)painter的painting)

[[349097]]

圖源:unsplash

控制生成器

運(yùn)行rails g controller 命令會提供一個(gè)控制文件(用于添加適當(dāng)操作)和相應(yīng)的視圖文件夾:

  1. railsg controller paintings 

資源生成器

如果用戶在在創(chuàng)建API過程中使用前端MVC架構(gòu),或只想手動創(chuàng)建視圖,resource生成器是編寫代碼的一個(gè)優(yōu)選。創(chuàng)建Painting資源:

  1. railsg resource Painting name image painter:belongs_to 

因?yàn)闆]有為name和image 編寫數(shù)據(jù)類型,因此默認(rèn)情況下它是一個(gè)字符串。添加 painter:belongs_to 來指定兩個(gè)表格的關(guān)系,并在paintings表格中設(shè)置一列 painter_id。也可以使用 references編寫上述命令(結(jié)果一樣):

  1. railsg resource Painting name image painter:references 

這是為不同模型編寫相同命令的另一個(gè)例子:

  1. railsg resource Answer content correct_answer:boolean question:belongs_to 

憑借生成器,目前的應(yīng)用程序擁有什么?

  • 一個(gè)遷移文件,能夠在生成器中為傳遞給它的屬性創(chuàng)建一個(gè)新的數(shù)據(jù)庫表
  • 繼承ApplicationRecord的模型文件(從Rails 5開始,見上述注意事項(xiàng))
  • 繼承了ApplicationController的控制器文件
  • 不帶有視圖模板文件的視圖目錄
  • 視圖helper文件
  • 用于該控制器的特定JavaScripts的Coffeescript文件
  • 用于控制器樣式的 scss文件
  • routes.rb文件內(nèi)的完整資源調(diào)用

resource生成器是一種智能生成器,創(chuàng)建全功能資源所需的一些核心功能,同時(shí)不會導(dǎo)致過多代碼膨脹。

路由

[[349098]]

圖源:unsplash

最后一項(xiàng)可能不太常見。通常resources:paintings被視作為一個(gè)“魔法”路由,它包含在應(yīng)用程序中執(zhí)行CRUD所需的全部RESTful路由。那么resources:paintings會轉(zhuǎn)化成什么?用濾波器運(yùn)行 rake routes 會比較簡單,這樣就只會呈現(xiàn)paintings的路由:

  1. rake routes | grep painting 

resources自動創(chuàng)建每個(gè)路由并使其對控制器可用。打開paintings_controller.rb文件會很有趣:路由列表中出現(xiàn)的操作都不存在。它創(chuàng)建的代碼非常少,只需添加應(yīng)用程序需要的功能。

Scaffold生成器

  1. rails g scaffold User username:string 

正確的命令可以創(chuàng)建有用的文件,設(shè)置路由和宏命令。希望本文能讓你理解Rails的神奇之處,MVC的定義和命令執(zhí)行。

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2009-12-17 14:29:50

Ruby on Rai

2009-08-27 10:21:22

Ruby on Rai

2020-12-07 19:00:29

Rails

2009-08-06 09:13:36

Ruby on Rai

2010-09-25 14:39:29

Bruce Tate

2016-09-27 23:54:16

2009-09-29 17:04:29

2011-09-15 09:19:30

2009-12-14 15:30:43

安裝Ruby on R

2009-12-17 15:56:34

Rails參數(shù)bind

2009-12-17 16:16:24

Rails方法send

2015-10-14 17:27:18

性能

2015-10-10 11:00:05

RubyRails性能

2009-12-16 16:37:59

Ruby on Rai

2009-07-20 13:31:50

Ruby on Rai

2012-05-16 09:29:25

JavaRailsJVM

2009-10-09 09:37:46

2009-06-17 10:08:32

Ruby on Rai安裝Ruby

2009-07-20 09:12:54

Ruby on Rai

2023-11-30 16:25:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩欧美一区二区三区 | 成人动漫视频网站 | 91色在线| 国产在线精品一区二区 | 男人的天堂亚洲 | 91在线中文字幕 | a级黄色片在线观看 | 亚洲一区二区三区观看 | 一级a爱片久久毛片 | 91影院在线观看 | www.亚洲一区二区 | 午夜电影在线播放 | 天天躁日日躁狠狠的躁天龙影院 | 国产1区2区3区 | www.久| 在线色网| 一区二区三区视频 | 日韩免费高清视频 | 日日操日日舔 | 国产精品美女久久久久久久久久久 | 在线中文视频 | 91影院在线观看 | 久久久久久久91 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 免费黄色大片 | 欧美a区 | 久久精品亚洲 | 亚洲一区自拍 | 亚洲一区二区三区在线播放 | 欧美一级视频免费看 | 亚洲成人一级 | 成人免费在线小视频 | 欧美国产一区二区三区 | 亚洲一区二区三区国产 | 日韩欧美三区 | 久久国产欧美日韩精品 | 久热久草 | 激情 亚洲 | 欧美日韩精品中文字幕 | 国产欧美日韩一区二区三区 | 国产精品区二区三区日本 |