---
# System prepended metadata

title: '[08/09_c] Rails實作 R -> C'
tags: [面試題, Rails]

---

# [08/09_c] Rails實作 R -> C

## Rails
以開放類別擴充Ruby，多了很多實用方法。

### 開始建立
1. 在目標目錄 rails new 專案名稱 => 開新專案。
2. 在目錄中新目錄 rails s => 開伺服器。
3. 可得到一個local 3000網址。

### 得到資料夾(用VSCode看)
* **app 大部分程式碼**(重要)
    * 資料夾 accets：圖片等
    * 資料夾 channels：即時通訊
    * 資料夾 helpers：放函式rb檔，讓views可以用   
    * 重要MVC
        * 資料夾 models 
        * 資料夾 views
        * 資料夾 controllers
* **config 設定檔**(重要)
    * **database.yml 資料庫設定檔**
        * 檔案中之
            * deault 為開發環境
            * develpoment 為發環境
            * test為測試環境
            * production 為發行
                * adapter: sqlite3 為使用之資料庫，串接對象（實體在db目錄下），改名後重啟rails server就生效
        * 推薦使用資料庫 PostgreSQL(開源版)
    * **routes.rb**
        * 裡面有個block
* **db database** (重要)
    * routes.yml 門口指路人
    * migrate:描述資料表的模樣
* lib
    * tasks 放任務
* node_modules 東西太多，不用於板控
* puclic 放公開網頁（靜態）
    * 包括404.html
* **config.ru 發動Rack**
* **Gemfile 版本資訊**
    * 瀏覽rails版本與已安裝套件
    * 板號規律
        * 6.1.3 Major.Minor.Patch
        * Patch向下相容，不會把專案弄壞
        * Minor變化較大，有風險
        * Major變化非常大，當作不相容
    * group :development, :test do //開發及測試環境中 載入
    * group :development do　//測試環境中 載入
* package.json 前端之內容
    * "devDependencies": //開發時才載入的

#### adapter:轉接頭，透過他讓rails跟database溝通
可在 Gem 搜尋 pg 或 sqllite 下載。

### 建立第一個網頁
- Route = 指路人 = 路徑解析
- **MVC結構的任務（面試題）**
    - **Controller** = 調度資料，流程控制
    - **Model** = 翻譯者 = 資料庫相關資料及邏輯
    透過 Ruby 語法跟 Model 溝通，Model 會轉換成 SQL 語言跟資料庫溝通，最後回傳人類訊息。
    此過程，會產生 Migration 檔：描述資料表內容，與 Git 版控一樣會記錄所有的變動(演進過程)。惟直接操作資料庫不紀錄。
    - **View** = 資料呈現，畫面相關 = 會回傳 HTML 內容的方法
    
![](https://i.imgur.com/wAq53f9.png)
#### Route
* 連路徑 /hello
* 詢問route路徑對照表
    * 在config/routes.db 告知正確路徑
    * 或是404
    * **編輯routes.rb**
```ruby=
Rails.application.routes.draw do
    get "/hello", to: "page#main" #若看到hello，就到controller「page」的「main」方法
end
```
* controller與方法實際指向"app/views/（controller名）/（方法名）.副檔名"

#### Controller（手動）
* 依錯誤訊息（找不到controller），在app/controllers下新增「**pages**_controller.rb」並繼承ActionController
    * 繼承之繼承，ActionController本身是空的，又繼承自ActionController::Base（功能都在這裡）
* 將**main**功能定義出來：
```ruby=
class PagesController  < ActionController::Base
  def main          
      render (html: 'My Hello Page') #若寫，渲染一個網頁
      #若不寫，會自動尋找 app/views/pages/main.html
      @abc = 123 #若寫實體變數，可在views目錄下網頁檔呈現
      
  end 
end
```
* 新增的controller在"app/controllers"下
* 依剛剛route設定的controller與方法名稱，手動在"app/views/ 下新增目錄（controller名）與檔案（方法名，副檔名也可為.html.erb）
    * 本例為：*app/views/pages/main.html*
        * 若要印出前例controller實體變數，可以拿出來：
        ```ruby=
        <%= @abc =%>
        ```

#### Controller（終端）
* 不使用VSCode，可在終端建立controller（例名稱：users），打指令：
    ```ruby=
   rails g controller users
    ```
* Rails自動規範：class名稱蛇式<==>檔案名稱駝峰式。
* 自動建立應有檔案/目錄後，其餘流程類似
    * 在（新）controllers.rb檔案定義（def）一個新方法
    * 手動在app/views/新目錄/ 下新增（方法名）檔案

#### 建立database
可以不用進資料庫操作，rails 就會顯示有沒有寫入。
可以把 excel 當資料庫來看，一個 excel 檔裡面有很多資料表，資料表有很多欄跟列，每一列都是一筆使用者的資料。


###### tags: `Rails`
###### tags: `面試題`