跳至主要内容

[指令] The Rails Command Line Interface (CLI)

在 Rails cli 中,有時候會看到使用 rails ,有時候用 bin/rails。如果是直接輸入 rails ,則它會在系統中的任何地方尋找到名為 rails 的執行檔並執行,因此如果你的系統安裝多於一個版本的 rails 時,這麼做可能會出問題,因此建議除了建立新專案時,其他時候都使用 bin/rails 指令開頭。

# 建立專案
rails new <project_name> --webpack=stimulus --database=postgresql --skip-coffee --skip-test
rails active_storage:install
rails generate scaffold Product title:string description:text image_url:string price:decimal
rails notes          # 找出所有 TODO 的項目
rails g # Rails generator
rails d # rails destroy 刪除產生器產生的檔案
rails s # rails server
rails c # rails console
rails dbconsole # 直接進到資料庫裡,使用 SQL 語法對資料庫進行存取
# run server
rails s
bin/rails s -e production # with production mode
rails server -p 3090 # Run server at specific port
rails s -b 0.0.0.0. # Binding on a proxy
# deploy
$ tail -f log/production.log # 進到 Rails 專案資料夾後,即可使用 tail 指令看 logs

rails assets

rails assets:clobber      // 把 assets 中的檔案砍掉
rails assets:precompile // 在 local 端執行 compile

Command Line @ RailsGuides

清除垃圾

# 必要時需要手動 rm -rf 刪除
$ rails log:clear
$ rake tmp:clear

建立 Rails 專案

若要建立新專案可進一步參考 [[Rails] 安裝並啟動 Rails 專案]([Rails] 安裝並啟動 Rails 專案.md) 。

Rails 常用指令

# 自動產生一組 MVC 的程式碼,完成一個簡易的 CRUD 程式
rails generate scaffold Product title:string description:text image_url:string price:decimal

rails destroy controller Stores # 如果 generate 錯誤,可以再把它 destroy (建議少用)
rails d controller Stores # destroy 可以省略成 d

rails server # 啟動伺服器(簡寫:rails s)
RAILS_ENV=production rails s # 以發佈環境啟動伺服器
rails routes # 顯示目前 rails 的路由設定

# 進行測試
rails test # 測試透過 scaffolding 產生的 model 和 controller 有無錯誤
rails test:controllers # 執行 functional tests
rails test:models # 執行 model tests

# 快取相關
rails dev:cache # 打開/關閉 開發環境下的快取機制

Generator 相關

# rails g model --help    查詢說明

rails g scaffold [ModelName] [attr1:type] [attr2:type]
rails g scaffold_controller NAME [field:type field:type] [options]
rails g controller [ControllerNames] [action_name]
rails g model [ModelName] [attr1:type] [attr2:type]
rails g migration [migration_name] [attr1:type]
rails g mailer [ControllerNames] [action_name]
rails g job [job_name]

scaffold

rails g scaffold Blog title:string body:text
rails g scaffold_controller NAME [field:type field:type] [options]

建議把 ./assets/stylesheets/scaffold.scss 這個檔案刪除,避免跑出多於的 css 檔。

Controller 相關

rails generate controller [ControllerName] [controller_method] ...            # 透過這個指令會產生相對應的 controller 和 views 檔案
rails generate controller Stores index # 產生名為 Store 的 controller,並且包含 index 的方法在內
rails g controller Store index # generate 可以簡寫為 g

Model 相關

rails generate model [ModelName] [attr1:type] [attr2:type]
rails generate model Page title:string body:text slug:string # 各欄位之間不用空格
rails g model Page title body:text slug # 若資料型態是 string 可以省略

資料庫設定相關

rails dbconsole                                                       # 進入 db 資料庫中,使用 SQL 語法存取(簡寫:rails db)
# 產生資料庫設定檔
rails -g migration [MigrationName]
rails generate migration combine_items_in_cart # 產生資料庫設定檔名為 combine_items_in_cart
rails generate migration add_quantity_to_line_items quantity:integer # 產生資料庫設定檔並設定欄位資料型態


# 資料庫設定檔與資料庫
rails db:create # 建立 database
rails db:migrate # 將資料庫設定檔(/db/migrate/22003840_create_products.rb)套用到資料庫上
rails db:rollback # 還原資料庫設定檔套用到資料庫上的動作(把 schema 還原)
rails db:drop # 資料庫移除
rails db:migrate:status # 檢視各資料庫設定檔執行的情況
rails db:seed # 執行 db/seeds.rb 的程式
rails db:rollback # 會把 Schema 還原

# 連續動作
rails db:reset # 會執行 db:drop => db:create => db:schema:load ( 資料庫欄位建立 ) => db:seed

完整指令 Difference between rake db:migrate db:reset and db:schema:load @ StackOverflow

執行 rails db 相關指令時,記得要把 db 的工具(例如,Postico)關閉。

其他指令

rake log:clear LOGS=test   # 清除 namespace :dev do
rails dev:build # 這是自己客制化的指令
rails console # 進入具備 rails 環境 IRB(簡寫 rails c)
rails about # 查看 rails 環境資訊
rails secrete # 產生安全碼(用來驗證 cookie 的正當性)

rails searchkick:reindex:all # 重新為 searchkik 建立索引
rails -T # 列出相關 rails 指令

客制化指令

雖然 db:reset 已經能自動地幫我們把資料庫清空、重建、跑 seed ,但如果想把整個開發中專案的資料一切歸零,還需要跑 rails log:clearrails tmp:clear

可以寫一個 rake 來自動化執行:

# lib/tasks/dev.rake
namespace :dev do
desc 'Rebuild system'
task build: ['tmp:clear', 'log:clear', 'db:drop', 'db:create', 'db:migrate']
task rebuild: ['dev:build', 'db:seed']
end

這樣只要打

  • rails dev:build:即可把專案資料一切清空歸零重建
  • rails dev:rebuild:即可重建完再跑 seed

撰寫 db:seed 與 自動化重整資料庫程式 @ Rails 101

欄位

:binary
:boolean
:date
:datetime
:decimal
:float
:integer
:primary_key
:string
:text
:time
:timestamp

參考