分享

[Rails][notes] MVC 官網閱讀紀錄[2]

記錄自己官網文件閱讀的注釋與筆記
主要也是訓練自己閱讀英文挑戰
https://guides.rubyonrails.org/getting_started.html

5 MVC and You

這節會討論routes, controllers, actions, and views
這裡會遵循典型的MVC模式 設計 Web ,MVC模式劃分了應用程序的職責
而Rails 將遵循這種模式,前一篇生成了 controller 跟view 這裡我們要產生下一個部分 model

5.1 Generating a Model

model 是一個用來表示資料的 Ruby Class,另外
model可以透過稱為Active Record 的Rails功能來與應用程式互相作用
可以透過以下腳本指令產生並定義 model
  

$ bin/rails generate model Article title:string body:text

通常model 的命名為單數
因為實作一個model 為單一一筆資料紀錄
同常會寫為 Article.new(...) 而非Articles.new(...)
使用上述腳本指令會產生以下檔案
  

invoke  active_record

create    db/migrate/<timestamp>_create_articles.rb

create    app/models/article.rb

invoke    test_unit

create      test/models/article_test.rb

create      test/fixtures/articles.yml

我們將會專注在這兩個檔案
  

db/migrate/<timestamp>_create_articles.rb

app/models/article.rb

5.2 Database Migrations

Migration 用來改變資料庫資料結構
在Rails 中將用Ruby撰寫migrations 因此與資料庫語法無關
接著我們來看看 migration 的內容

  

class CreateArticles < ActiveRecord::Migration[6.0]

  def change

    create_table :articles do |t|

      t.string :title

      t.text :body


      t.timestamps

    end

  end




這裡調用create_table的是用來指定建造一個 articles 的資料表
create_table 默認設定增加 id 的欄位 並且設定為AI 自動增加
主鍵(primary key) 因此這個表的第一筆紀錄將會設定為id=1,而第二筆
會自動設定為id=2
  而在create_table的區塊中有兩個欄位被定義 title and body ,而這是因為我們在生成腳本指令中,有填入這項引數,因此Rails產生的過程中為我們添加在這個表裡面.(bin/rails generate model Article title:string body:text)
而在最後一行的t.timestamps 。 這個方法會添加兩個欄位為 created_at and updated_at 用於記錄資料建立時間與修改更新的時間。而rails 將會為我們管理與設定 created_at and updated_at  這兩個數據
接著我們執行以下指令
  

$ bin/rails db:migrate

指令將會顯示指出資料表已經被建立
  

==CreateArticles: migrating===============================

-- create_table(:articles)

   -> 0.0018s

==  CreateArticles: migrated (0.0018s) ==========================

接著我們就可以利用 model 與資料表互相作用 

5.3 Using a Model to Interact with the Database

我可以前往Rails 的一個功能叫做console 來稍微玩一下 model
console 是類似irb 的一個互動式環境,但他會自動加載rails 與 應用程序的程式碼
如何啟動console?執行以下指令
  

$ bin/rails console

它看起來會類似這樣
  

Loading development environment (Rails 6.0.2.1) 

irb(main):001:0>

讓我來初始化一筆新的資料
  

article = Article.new(title: "Hello Rails", body: "I am on Rails!")

這裡有一點需要注意當使用 new 來初始化一個物件時
這個物件並不會儲存到資料庫,而他的有效範圍 只存在console 這個環境
而要將資料儲存進資料庫需執行以下指令
  

irb>  article.save

會得到回饋如下
  

(0.1ms)  begin transaction Article Create (0.4ms)  INSERT INTO "articles" ("title", "body", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["title", "Hello Rails"], ["body", "I am on Rails!"], ["created_at", "2020-01-18 23:47:30.734416"], ["updated_at", "2020-01-18 23:47:30.734416"]] (0.9ms)  commit transaction => true

上述回饋訊息可以看見INSERT INTO "articles" ... 代表資料(article = Article.new(title: "Hello Rails", body: "I am on Rails!"))已經被寫入資料庫
讓我們再看一次article
  

irb> article => #<Article id: 1, title: "Hello Rails", body: "I am on Rails!", created_at: "2020-01-18 23:47:30", updated_at: "2020-01-18 23:47:30">

發現 id 與created_at, and updated_at 的屬性 已經被rails 填入資料
當我們儲存時 rails 為我們完成了這個動作
當我們需要提取一筆資料我們可以在model 使用find並使用 id 這個參數
  

irb> Article.find(1) => #<Article id: 1, title: "Hello Rails", body: "I am on Rails!", created_at: "2020-01-18 23:47:30", updated_at: "2020-01-18 23:47:30">

若是要提取全部資料可以使用 all 
  

irb> Article.all

 => #<ActiveRecord::Relation [#<Article id: 1, title: "Hello Rails", body: "I am on Rails!", created_at: "2020-01-18 23:47:30", updated_at: "2020-01-18 23:47:30">]>

接下來我們將MVC串接在一起

5.4 Showing a List of Articles

讓我們回到controller 的app/controllers/articles_controller.rb 檔案
修改 action index 提取所有的articles資料
  

class ArticlesController < ApplicationController

  def index

    @articles = Article.all

  end

end

Controller 中的實體變數可以被 view存取,這意味我們可以在app/views/articles/index.html.erb 中存取 @articles
  

<h1>Articles</h1>

<ul>

  <% @articles.each do |article| %>

    <li>

      <%= article.title %>

    </li>

  <% end %>

</ul>

上面顯示的是html與erb的混合代碼,
ERB是一個可以嵌入RUBY的樣板系統文檔
我們可以看到兩個ERB標籤 <% %> and <%= %>
<% %>可以在代表可以在tag封閉中執行RUBY程式
<%= %>可以在代表可以在tag封閉中執行RUBY程式 並且顯示出返回結果
這時啟動伺服器
  

bin/rails server

可以在瀏覽器http://localhost:3000 看到結果
  1. 瀏覽器會提出GET http://localhost:3000 
  2. Rails 會接收到來自瀏覽器的要求
  3. Rails routes 會對應到根目錄的路徑並導向到 ArticlesController 中的index
  4. index action 會使用 Article model 到資料庫提取所有的 Articles
  5. Rails 會自動渲染 “app/views/articles/index.html.erb” view
  6. ERB 將會被判斷或轉換輸出為HTML在VIEW
  7. 伺服器將傳送一個包含HTML的內容返回瀏覽器
這樣就將MVC連接在一起,完成第一個action
#官網  #文件  #注釋  #筆記  #getting 
分類:學習

評論
上一篇
  • [Rails][notes]官網閱讀紀錄[1]
  • 下一篇
  • [Rails][notes] CRUD -C: Create官網閱讀紀錄[3]
  • 更多文章
    載入中... 沒有更多了