edge
更多資訊請參考 rubyonrails.org: 更多 Ruby on Rails

Rails命令行

閱讀完本指南後,您將會知道:

注意:本教程假設您已經通過閱讀開始使用Rails指南獲得了基本的Rails知識。

1 建立一個Rails應用程式

首先,讓我們使用rails new命令創建一個簡單的Rails應用程式。

我們將使用這個應用程式來玩耍和發現本指南中描述的所有命令。

資訊:如果您尚未安裝rails gem,可以輸入gem install rails來安裝。

1.1 rails new

我們將傳遞給rails new命令的第一個參數是應用程式名稱。

$ rails new my_app
     create
     create  README.md
     create  Rakefile
     create  config.ru
     create  .gitignore
     create  Gemfile
     create  app
     ...
     create  tmp/cache
     ...
        run  bundle install

Rails將為這麼一個微小的命令設置了大量的東西!我們現在擁有了整個Rails目錄結構,其中包含了運行我們簡單應用程式所需的所有代碼。

如果您希望跳過某些要生成的文件或跳過某些庫,可以將以下任何參數附加到您的rails new命令中:

參數 描述
--skip-git 跳過git init、.gitignore和.gitattributes
--skip-docker 跳過Dockerfile、.dockerignore和bin/docker-entrypoint
--skip-keeps 跳過源控制的.keep文件
--skip-action-mailer 跳過Action Mailer文件
--skip-action-mailbox 跳過Action Mailbox gem
--skip-action-text 跳過Action Text gem
--skip-active-record 跳過Active Record文件
--skip-active-job 跳過Active Job
--skip-active-storage 跳過Active Storage文件
--skip-action-cable 跳過Action Cable文件
--skip-asset-pipeline 跳過Asset Pipeline
--skip-javascript 跳過JavaScript文件
--skip-hotwire 跳過Hotwire集成
--skip-jbuilder 跳過jbuilder gem
--skip-test 跳過測試文件
--skip-system-test 跳過系統測試文件
--skip-bootsnap 跳過bootsnap gem

這些只是rails new接受的一些選項。要查看完整的選項列表,輸入rails new --help

1.2 預配置不同的資料庫

在創建新的Rails應用程式時,您可以選擇指定應用程式將使用的資料庫類型。這將為您節省幾分鐘的時間,當然也會減少許多按鍵。

讓我們看看--database=postgresql選項對我們的影響:

$ rails new petstore --database=postgresql
      create
      create  app/controllers
      create  app/helpers
...

讓我們看看它在我們的config/database.yml中放了什麼:

# PostgreSQL. Versions 9.3 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On macOS with Homebrew:
#   gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem "pg"
#
default: &default
  adapter: postgresql
  encoding: unicode

  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: petstore_development
...

它生成了一個與我們選擇的PostgreSQL相對應的資料庫配置。

2 命令行基礎知識

有一些命令對於您日常使用Rails是絕對至關重要的。按照您可能使用它們的順序,它們是:

  • bin/rails console
  • bin/rails server
  • bin/rails test
  • bin/rails generate
  • bin/rails db:migrate
  • bin/rails db:create
  • bin/rails routes
  • bin/rails dbconsole
  • rails new app_name

您可以通過輸入rails --help來獲取可用的rails命令列表,這通常取決於您當前的目錄。每個命令都有一個描述,應該能幫助您找到所需的東西。

$ rails --help
使用方法:
  bin/rails COMMAND [options]

您必須指定一個命令。最常用的命令有:

  generate     生成新的代碼(縮寫: "g")
  console      啟動Rails控制台(縮寫: "c")
  server       啟動Rails伺服器(縮寫: "s")
  ...

除了這些命令外,還有:
about                               列出所有Rails版本...
assets:clean[keep]                  刪除舊的編譯資產
assets:clobber                      刪除編譯的資產
assets:environment                  載入資產編譯環境
assets:precompile                   編譯所有資產...
...
db:fixtures:load                    將測試數據加載到...
db:migrate                          遷移資料庫...
db:migrate:status                   顯示遷移的狀態
db:rollback                         將模式回滾到...
db:schema:cache:clear               清除db/schema_cache.yml文件
db:schema:cache:dump                創建db/schema_cache.yml文件
db:schema:dump                      創建資料庫模式文件(db/schema.rb或db/structure.sql...
db:schema:load                      加載資料庫模式文件(db/schema.rb或db/structure.sql...
db:seed                             加載種子數據...
db:version                          檢索當前模式...
...
restart                             通過觸摸...
tmp:create                          創建tmp目錄...

2.1 bin/rails server

bin/rails server 命令啟動一個名為 Puma 的網頁伺服器,Puma 是隨 Rails 捆綁提供的。您可以在任何時候通過網頁瀏覽器訪問應用程序時使用此命令。

只需執行 bin/rails server,我們就可以運行全新的 Rails 應用程序:

$ cd my_app
$ bin/rails server
=> Booting Puma
=> Rails 7.0.0 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.7-p206), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop

只需三個命令,我們就可以在 3000 端口上運行一個 Rails 伺服器。打開瀏覽器,訪問 http://localhost:3000,您將看到一個基本的 Rails 應用程序運行。

您也可以使用別名 "s" 來啟動伺服器:bin/rails s

使用 -p 選項可以在不同的端口上運行伺服器。使用 -e 可以更改默認的開發環境。

$ bin/rails server -e production -p 4000

-b 選項將 Rails 綁定到指定的 IP,默認為 localhost。通過傳遞 -d 選項,可以將伺服器運行為守護進程。

2.2 bin/rails generate

bin/rails generate 命令使用模板來創建許多東西。執行 bin/rails generate 命令本身將顯示可用的生成器列表:

您也可以使用別名 "g" 來調用生成器命令:bin/rails g

$ bin/rails generate
Usage:
  bin/rails generate GENERATOR [args] [options]

...
...

請從以下生成器中選擇。

Rails:
  assets
  channel
  controller
  generator
  ...
  ...

注意:您可以通過生成器 gem、插件的部分或自己創建生成器來安裝更多生成器!

使用生成器可以通過生成樣板代碼(必須的應用程序代碼)節省大量時間。

讓我們使用控制器生成器創建自己的控制器。但是應該使用哪個命令呢?讓我們問問生成器:

INFO:所有的 Rails 控制台工具都有幫助文本。與大多數 *nix 工具一樣,您可以嘗試在末尾添加 --help-h,例如 bin/rails server --help

$ bin/rails generate controller
Usage:
  bin/rails generate controller NAME [action action] [options]

...
...

Description:
    ...

    要在模塊內創建控制器,請將控制器名稱指定為類似 'parent_module/controller_name' 的路徑。

    ...

Example:
    `bin/rails generate controller CreditCards open debit credit close`

    帶有像 /credit_cards/debit 這樣的 URL 的信用卡控制器。
        控制器:app/controllers/credit_cards_controller.rb
        測試:test/controllers/credit_cards_controller_test.rb
        視圖:app/views/credit_cards/debit.html.erb [...]
        助手:app/helpers/credit_cards_helper.rb

控制器生成器期望以 generate controller ControllerName action1 action2 的形式提供參數。讓我們使用一個名為 Greetings 的控制器,並添加一個名為 hello 的動作,該動作將對我們說些好話。

$ bin/rails generate controller Greetings hello
     create  app/controllers/greetings_controller.rb
      route  get 'greetings/hello'
     invoke  erb
     create    app/views/greetings
     create    app/views/greetings/hello.html.erb
     invoke  test_unit
     create    test/controllers/greetings_controller_test.rb
     invoke  helper
     create    app/helpers/greetings_helper.rb
     invoke    test_unit

這個生成器生成了什麼?它確保了我們的應用程序中有一堆目錄,並創建了一個控制器文件、一個視圖文件、一個功能測試文件、一個視圖的助手、一個 JavaScript 文件和一個樣式表文件。

檢查控制器並對其進行一些修改(在 app/controllers/greetings_controller.rb 中):

class GreetingsController < ApplicationController
  def hello
    @message = "Hello, how are you today?"
  end
end

然後修改視圖,以顯示我們的消息(在 app/views/greetings/hello.html.erb 中):

<h1>A Greeting for You!</h1>
<p><%= @message %></p>

使用 bin/rails server 啟動伺服器。

$ bin/rails server
=> Booting Puma...

URL 將為 http://localhost:3000/greetings/hello

INFO:對於一個普通的 Rails 應用程序,URL 通常遵循 http://(host)/(controller)/(action) 的模式,而像 http://(host)/(controller) 這樣的 URL 將觸發該控制器的 index 動作。

Rails 還提供了用於數據模型的生成器。

$ bin/rails generate model
Usage:
  bin/rails generate model NAME [field[:type][:index] field[:type][:index]] [options]

...

ActiveRecord options:
      [--migration], [--no-migration]        # 指示何時生成遷移
                                             # 默認值:true

...

Description:
    生成一個新的模型。將模型名稱(CamelCased 或 under_scored)和一個可選的屬性對列表作為參數傳遞。

...

注意:有關 type 參數可用的字段類型列表,請參閱 SchemaStatements 模塊的 add_column 方法的 API 文檔index 參數將為該列生成相應的索引。 但是在直接生成模型之前(我们稍后会做),讓我們先設置一個脚手架。在Rails中,脚手架是一套完整的模型、用於該模型的數據庫遷移、用於操作它的控制器、用於查看和操作數據的視圖,以及上述每個部分的測試套件。

我們將設置一個名為“HighScore”的簡單資源,用於記錄我們在玩視頻遊戲時的最高分。

$ bin/rails generate scaffold HighScore game:string score:integer
    invoke  active_record
    create    db/migrate/20190416145729_create_high_scores.rb
    create    app/models/high_score.rb
    invoke    test_unit
    create      test/models/high_score_test.rb
    create      test/fixtures/high_scores.yml
    invoke  resource_route
     route    resources :high_scores
    invoke  scaffold_controller
    create    app/controllers/high_scores_controller.rb
    invoke    erb
    create      app/views/high_scores
    create      app/views/high_scores/index.html.erb
    create      app/views/high_scores/edit.html.erb
    create      app/views/high_scores/show.html.erb
    create      app/views/high_scores/new.html.erb
    create      app/views/high_scores/_form.html.erb
    invoke    test_unit
    create      test/controllers/high_scores_controller_test.rb
    create      test/system/high_scores_test.rb
    invoke    helper
    create      app/helpers/high_scores_helper.rb
    invoke      test_unit
    invoke    jbuilder
    create      app/views/high_scores/index.json.jbuilder
    create      app/views/high_scores/show.json.jbuilder
    create      app/views/high_scores/_high_score.json.jbuilder

生成器為HighScore創建了模型、視圖、控制器、資源路由和數據庫遷移(創建了high_scores表)。並為這些部分添加了測試。

遷移要求我們進行遷移,也就是運行一些Ruby代碼(從上面的輸出中的20190416145729_create_high_scores.rb文件)來修改我們的數據庫架構。哪個數據庫?當我們運行bin/rails db:migrate命令時,Rails將為您創建的SQLite3數據庫。我們將在下面更詳細地討論該命令。

$ bin/rails db:migrate
==  CreateHighScores: migrating ===============================================
-- create_table(:high_scores)
   -> 0.0017s
==  CreateHighScores: migrated (0.0019s) ======================================

資訊:讓我們談談單元測試。單元測試是測試和斷言代碼的代碼。在單元測試中,我們對代碼的一小部分進行測試,比如模型的一個方法,並測試其輸入和輸出。單元測試是您的朋友。當您對單元測試代碼進行單元測試時,您的生活質量將大大提高。真的。請參閱測試指南以深入了解單元測試。

讓我們看看Rails為我們創建的界面。

$ bin/rails server

在瀏覽器中打開http://localhost:3000/high_scores,現在我們可以創建新的高分(Space Invaders上的55,160分!)

2.3 bin/rails console

console命令允許您從命令行與Rails應用程序進行交互。在底層,bin/rails console使用IRB,所以如果您以前使用過它,您會非常熟悉。這對於使用代碼測試快速想法並在不觸及網站的情況下在服務器端更改數據非常有用。

資訊:您還可以使用別名“c”來調用控制台:bin/rails c

您可以指定console命令應運行的環境。

$ bin/rails console -e staging

如果您希望在不更改任何數據的情況下測試一些代碼,可以通過調用bin/rails console --sandbox來實現。

$ bin/rails console --sandbox
Loading development environment in sandbox (Rails 7.1.0)
Any modifications you make will be rolled back on exit
irb(main):001:0>

2.3.1 apphelper對象

bin/rails console中,您可以訪問apphelper實例。

使用app方法,您可以訪問命名路由助手,並進行請求。

irb> app.root_path
=> "/"

irb> app.get _
Started GET "/" for 127.0.0.1 at 2014-06-19 10:41:57 -0300
...

使用helper方法,可以訪問Rails和應用程序的幫助程序。

irb> helper.time_ago_in_words 30.days.ago
=> "about 1 month"

irb> helper.my_custom_helper
=> "my custom helper"

2.4 bin/rails dbconsole

bin/rails dbconsole會找出您使用的數據庫,並將您放入您將使用的命令行界面(並且還會找出要給它的命令行參數!)。它支持MySQL(包括MariaDB)、PostgreSQL和SQLite3。

資訊:您還可以使用別名“db”來調用dbconsole:bin/rails db

如果您使用多個數據庫,bin/rails dbconsole將默認連接到主要數據庫。您可以使用--database--db指定要連接的數據庫:

$ bin/rails dbconsole --database=animals

2.5 bin/rails runner

runner以非交互方式在Rails上下文中運行Ruby代碼。例如:

$ bin/rails runner "Model.long_running_method"

資訊:您還可以使用別名“r”來調用runner:bin/rails r

您可以使用-e開關指定runner命令應運行的環境。

$ bin/rails runner -e staging "Model.long_running_method"

您甚至可以使用runner執行寫在檔案中的Ruby程式碼。

$ bin/rails runner lib/code_to_be_run.rb

2.6 bin/rails destroy

destroy視為generate的相反操作。它會找出generate所做的事情並將其還原。

您也可以使用別名"d"來呼叫destroy指令:bin/rails d

$ bin/rails generate model Oops
      invoke  active_record
      create    db/migrate/20120528062523_create_oops.rb
      create    app/models/oops.rb
      invoke    test_unit
      create      test/models/oops_test.rb
      create      test/fixtures/oops.yml
$ bin/rails destroy model Oops
      invoke  active_record
      remove    db/migrate/20120528062523_create_oops.rb
      remove    app/models/oops.rb
      invoke    test_unit
      remove      test/models/oops_test.rb
      remove      test/fixtures/oops.yml

2.7 bin/rails about

bin/rails about提供有關Ruby、RubyGems、Rails、Rails子組件、應用程式資料夾、目前Rails環境名稱、應用程式的資料庫適配器和架構版本的版本號資訊。當您需要尋求幫助、檢查安全補丁是否會影響您,或者需要一些現有Rails安裝的統計資料時,它非常有用。

$ bin/rails about
關於您的應用程式環境
Rails 版本             7.0.0
Ruby 版本              2.7.0 (x86_64-linux)
RubyGems 版本          2.7.3
Rack 版本              2.0.4
JavaScript Runtime        Node.js (V8)
Middleware:               Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Sprockets::Rails::QuietAssets, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, Rack::Head, Rack::ConditionalGet, Rack::ETag
應用程式根目錄          /home/foobar/my_app
環境               開發環境
資料庫適配器          sqlite3
資料庫架構版本   20180205173523

2.8 bin/rails assets:

您可以使用bin/rails assets:precompile預編譯app/assets中的資源,並使用bin/rails assets:clean刪除較舊的編譯資源。assets:clean指令允許在新資源建立時仍連結到舊資源的滾動部署。

如果您想完全清除public/assets,可以使用bin/rails assets:clobber

2.9 bin/rails db:

db: Rails命名空間中最常見的命令是migratecreate,嘗試使用所有遷移Rails命令(updownredoreset)將會很有價值。當排除故障時,bin/rails db:version非常有用,它會告訴您資料庫的當前版本。

有關遷移的更多資訊可以在Migrations指南中找到。

2.10 bin/rails notes

bin/rails notes會搜索您的程式碼,尋找以特定關鍵字開頭的註解。您可以參考bin/rails notes --help以獲取有關使用方法的資訊。

默認情況下,它會在appconfigdblibtest目錄中搜索擴充名為.builder.rb.rake.yml.yaml.ruby.css.js.erb的文件中的FIXME、OPTIMIZE和TODO註解。

$ bin/rails notes
app/controllers/admin/users_controller.rb:
  * [ 20] [TODO] 有其他方法可以做到這一點嗎?
  * [132] [FIXME] 下一次部署的高優先級

lib/school.rb:
  * [ 13] [OPTIMIZE] 重構此代碼以提高速度
  * [ 17] [FIXME]

2.10.1 註解

您可以使用--annotations參數傳遞特定的註解。默認情況下,它會搜索FIXME、OPTIMIZE和TODO。

$ bin/rails notes --annotations FIXME RELEASE
app/controllers/admin/users_controller.rb:
  * [101] [RELEASE] 在下一個版本發布之前,我們需要檢查這個問題
  * [132] [FIXME] 下一次部署的高優先級

lib/school.rb:
  * [ 17] [FIXME]

2.10.2 標籤

您可以使用config.annotations.register_tags添加更多要搜索的默認標籤。它接收一個標籤列表。

config.annotations.register_tags("DEPRECATEME", "TESTME")
$ bin/rails notes
app/controllers/admin/users_controller.rb:
  * [ 20] [TODO] 對此進行A/B測試
  * [ 42] [TESTME] 這需要更多的功能測試
  * [132] [DEPRECATEME] 確保此方法在下一個版本中被棄用

2.10.3 目錄

您可以使用config.annotations.register_directories添加更多要搜索的默認目錄。它接收一個目錄名稱列表。

config.annotations.register_directories("spec", "vendor")
$ bin/rails notes
app/controllers/admin/users_controller.rb:
  * [ 20] [TODO] 有其他方法可以做到這一點嗎?
  * [132] [FIXME] 下一次部署的高優先級

lib/school.rb:
  * [ 13] [OPTIMIZE] 重構此代碼以提高速度
  * [ 17] [FIXME]

spec/models/user_spec.rb:
  * [122] [TODO] 驗證具有訂閱的使用者是否有效

vendor/tools.rb:
  * [ 56] [TODO] 擺脫這個依賴性

2.10.4 擴展名

您可以使用config.annotations.register_extensions添加更多要搜索的默認檔案擴展名。它接收一個帶有相應正則表達式的擴展名列表。

config.annotations.register_extensions("scss", "sass") { |annotation| /\/\/\s*(#{annotation}):?\s*(.*)$/ }
$ bin/rails notes
app/controllers/admin/users_controller.rb:
  * [ 20] [TODO] 有其他方法可以做到這一點嗎?
  * [132] [FIXME] 下一次部署的高優先級

app/assets/stylesheets/application.css.sass:
  * [ 34] [TODO] 對這個類使用偽元素

app/assets/stylesheets/application.css.scss:
  * [  1] [TODO] 拆分為多個組件

lib/school.rb:
  * [ 13] [OPTIMIZE] 重構此代碼以提高速度
  * [ 17] [FIXME]

spec/models/user_spec.rb:
  * [122] [TODO] 驗證具有訂閱的使用者是否有效

vendor/tools.rb:
  * [ 56] [TODO] 擺脫這個依賴性

2.11 bin/rails routes

bin/rails routes 會列出所有已定義的路由,這對於追蹤應用程式中的路由問題或熟悉應用程式中的 URL 提供了很好的概覽。

2.12 bin/rails test

資訊:有關在 Rails 中進行單元測試的詳細說明,請參閱 A Guide to Testing Rails Applications

Rails 預設使用一個名為 minitest 的測試框架。Rails 的穩定性得益於測試的使用。test: 命名空間中的命令有助於執行不同的測試。

2.13 bin/rails tmp:

Rails.root/tmp 目錄類似於 *nix 的 /tmp 目錄,用於存放暫存檔案,例如進程 ID 檔案和快取動作。

tmp: 命名空間中的命令將幫助您清除和建立 Rails.root/tmp 目錄:

  • bin/rails tmp:cache:clear 清除 tmp/cache
  • bin/rails tmp:sockets:clear 清除 tmp/sockets
  • bin/rails tmp:screenshots:clear 清除 tmp/screenshots
  • bin/rails tmp:clear 清除所有快取、插座和螢幕截圖檔案。
  • bin/rails tmp:create 建立用於快取、插座和進程 ID 的 tmp 目錄。

2.14 其他

  • bin/rails initializers 以 Rails 調用它們的順序列印出所有已定義的初始化器。
  • bin/rails middleware 列出應用程式啟用的 Rack 中介軟體堆疊。
  • bin/rails stats 非常適合查看代碼統計資訊,例如 KLOC(千行代碼)和代碼與測試比例。
  • bin/rails secret 將為您提供一個偽隨機金鑰,供您用於會話密鑰。
  • bin/rails time:zones:all 列出 Rails 知道的所有時區。

2.15 自訂 Rake 任務

自訂的 Rake 任務使用 .rake 副檔名並放置在 Rails.root/lib/tasks 目錄中。您可以使用 bin/rails generate task 命令來創建這些自訂的 Rake 任務。

desc "我是簡短但全面的描述我的酷炫任務"
task task_name: [:prerequisite_task, :another_task_we_depend_on] do
  # 在這裡進行所有的魔法
  # 允許任何有效的 Ruby 代碼
end

要將參數傳遞給自訂的 Rake 任務:

task :task_name, [:arg_1] => [:prerequisite_1, :prerequisite_2] do |task, args|
  argument_1 = args.arg_1
end

您可以通過將它們放置在命名空間中來分組任務:

namespace :db do
  desc "此任務什麼都不做"
  task :nothing do
    # 真的什麼都不做
  end
end

執行任務的方式如下:

$ bin/rails task_name
$ bin/rails "task_name[value 1]" # 整個參數字串應該用引號括起來
$ bin/rails "task_name[value 1,value2,value3]" # 使用逗號分隔多個參數
$ bin/rails db:nothing

如果您需要與應用程式模型互動、執行資料庫查詢等操作,您的任務應該依賴於 environment 任務,該任務將載入您的應用程式代碼。

task task_that_requires_app_code: [:environment] do
  User.create!
end

回饋

歡迎協助提升本指南的品質。

如果您發現任何錯別字或事實錯誤,請貢獻您的力量。 開始之前,您可以閱讀我們的 文件貢獻 部分。

您也可能會發現不完整的內容或過時的資訊。 請為主要的文件補充任何遺漏的內容。請先檢查 Edge 指南,以確認問題是否已經修復或尚未在主分支上修復。 請參考 Ruby on Rails 指南指引 以了解風格和慣例。

如果您發現需要修復但無法自行修補的問題,請 開啟一個問題

最後但同樣重要的是,關於 Ruby on Rails 文件的任何討論都非常歡迎在 官方 Ruby on Rails 論壇 上進行。