iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
自我挑戰組

30天 Ruby on Rails 挑戰系列 第 3

Rails 30天挑戰第三天 CRUD(一)

  • 分享至 

  • xImage
  •  

寫出基本有新增修改功能的網頁。

專案名就取名叫Bookstore,路徑名就叫book,table欄內有標題:title跟內容:content,價格:price

$rails new Bookstore

Route設定

首先一切的開頭從Route開始。
打開config/routes.rb

Rails.application.routes.draw do
  resources :books
end

在終端輸入看一下路徑$rails routes -c books

Perfix在rails可以說是超聯結的名字,例如最上面的books,只要在後面加上_path,也就是books_path,就可以連到index那裡去。

如果Perfix上沒有寫的那就是默認同上,例如你要找最下面destroy,那就是book_path,但是後面要加上method,method要寫的就是Perfix旁的Verb
也就是book_path, method: "delete"

常用Perfix_path的有 超連結link_to,轉址redirect_to,以及form_tag、form_with 方法。


設立controller

在終端機輸入$rails g controller books

g是generate的縮寫,工程師偷懶是美德,寫個g就好

這個指令會幫我們創出好幾個東西,其中最常用的兩個:

一個是controller,在app/controllers/幫你建立books_controller.rb
當然你也可以自己手打

class BooksController < ApplicationController
end

要注意的是在class的books_controller會寫成大寫BooksController。可以看到BooksController引繼ApplicationController

application_controller.rb是所有controller的最上層,因此如果有個方法想要所有controller都會使用到的話,就可以寫在這裡。

打開application_controller.rb

class ApplicationController < ActionController::Base
end

可以看到ApplicationController < ActionController::Base,ActionController::Base是Rails這個框架在背後做事情的地方,也就是我們能接觸的最上層就只到ApplicationControlle


另一個幫我們創出的是在app/views幫我們創出books這個資料夾,
我們可以在這個資料夾建立controller裡面action所對應的action.html.erb。在controller的action會有內建的render,默認render到他的action.html.erb

render這個方法他並不是轉網址路徑,而是借用views的html.erb所寫的畫面去做渲染。

建立model

在終端機輸入

$rails g model Book title:string content:text price:integer

:string是默認設定可以省略,string能存入的字數有限,所以內容content用text能寫很多的字。integer則是限制輸入的是數字,如果你在裡面打文字會變成0。

可以寫成

$rails g model Book title content:text price:integer


這個指令會幫我們生出兩個重要的東西,一個是在app/models的book.rb也就是book的model。

另一個則是在db/migrate建立的migration:20220813183516_create_books.rb,名字前面會是一團數字。
打開它可以看到我們要對資料庫所建立的table設定。這時候只有設定,還沒建立起來。

class CreateBooks < ActiveRecord::Migration[6.1]
  def change
    create_table :books do |t|
      t.string :title
      t.text :content
      t.integer :price

      t.timestamps
    end
  end
end

可以注意到的是Class上面的是大寫,而table名則是小寫。
這就是在rails的慣例。在rails有著慣例優於設定的法則,
只要大家都遵循著相同的慣例,一起做專案就會很方便。

另外在rails會有一欄默認的id,也就是流水編號。
t.timestamps會建立兩個欄位created_at與updated_at這兩個時間欄位,分別代表著創立時間與修改時間,所以在這張table總共建立了六個欄位。

再來就是要把這張table做具現化

在終端機輸入

$rails db:migrate

這個指令會在資料庫建立一個叫books的table。如果資料庫還沒建立,他會生成一個叫development.splite3的資料庫。

我們可以在這裡看到table裡有哪些資料,當然現在才剛建立,裡面一筆資料都沒有。
若是使用其他資料庫的,也可以用rails console去查看。

另外這指令還會生成一個叫schema.rb檔案,上面會寫上目前table的設定,因為我們可以再創立migration去對table做更改,所以直接看20220813183516_create_books.rb是不準確的。所以才要用schema.rb去紀錄table的設定。

schema:

ActiveRecord::Schema.define(version: 2022_08_13_183516) do

  create_table "books", force: :cascade do |t|
    t.string "title"
    t.text "content"
    t.integer "price"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end
``

上一篇
Rails 30天挑戰第二天 Route
下一篇
Rails 30天挑戰第四天 CRUD(二)
系列文
30天 Ruby on Rails 挑戰6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言