今天簡單地整理了基礎卻重要的概念:Rails 的環境 – Development / Test / Production。


Rails 的環境

Rails 的環境預設為以下三種:

  • Development 開發
  • Test 測試
  • Production 上線

config/environments 底下,有分別對應的設定檔:

  • development.rb
  • test.rb
  • prodcution.rb

config/database.yml 中,定義了三個環境所使用的資料庫設定,預設資料庫為 sqlite3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# SQLite version 3.x
# gem install sqlite3
#
# Ensure the SQLite 3 gem is defined in your Gemfile
# gem 'sqlite3'
#
default: &default
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } =%>
timeout: 5000

development:
<<: *default
database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3

production:
<<: *default
database: db/production.sqlite3



環境的差異

Development 開發環境

  • 在開發環境下,修改一個東西後,只要重整瀏覽器就可以看到更改後的結果。因為 Rails 關閉 cache,讓每一次的 HTTP request 都會重新載入 class,不需要手動重啟 server,以加快開發週期。

  • Rails 只有在連線來自本地端的時候,會將錯誤訊息顯示在瀏覽器上,讓開發人員可以查詢錯誤的設定。

(若還沒有 migrate, Rails 也會提醒你記得執行 rails db:migrate)


Test 測試環境

  • 在專用的測試資料庫中,可以獨立設置、處理測試數據,用完即清除,不用擔心影響到開發或上線資料庫。

  • 當通過測試時,會輸出點 . (dot);測試失敗時,會出現 F ;當測試出錯時,會丟 E 出來;最後一行則是摘要。

    範例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ bin/rake test test/models/article_test.rb test_should_not_save_article_without_title
    F

    Finished tests in 0.044632s, 22.4054 tests/s, 22.4054 assertions/s.

    1) Failure:
    test_should_not_save_article_without_title(ArticleTest) [test/models/article_test.rb:6]:
    Failed assertion, no message given.

    1 tests, 1 assertions, 1 failures, 0 errors, 0 skips

*注意:Rails 預設是用關聯式資料庫的 Transaction 功能,所以每次之間增修的資料都會清除。但是如果資料庫不支援(例如 MySQL 的 MyISAM 格式就不支援)或是用如 MongoDB 的 NoSQL,就要自己處理。


Production 上線環境

  • 在開發環境下 cache_classes = false ,但上線環境為了增加效能,減少 request 數量,預設 cache_classes = true ,class 檔案載入記憶體後就快取起來了。
  • 出現例外錯誤時,會依照錯誤種類,印出 public 資料夾底下 500.html404.html422.html檔案。



預設設定檔整理

項目 development prodcution test
cache_classes false true true
eager_load false true false
serve_static_files true
static_cache_control 註 4
consider_all_requests_local true false true
serve_static_files 註 2
log_level :debug
log_formatter 註 3
action_controller
perform_caching false true false
allow_forgery_protection false
action_dispatch
show_exceptions false
action_mailer
delivery_method :letter_opener :test
default_url_options 註 1
raise_delivery_errors false
active_support
test_order :random
deprecation :log :notify :stderr
active_record
migration_error :page_load
dump_schema_after_migration false
assets
debug true
digest true true
raise_runtime_errors true
js_compressor :uglifier
compile false
i18n
fallbacks true


參考資料:

https://rails.ruby.tw/testing.html
http://teotti.com/use-of-rails-environments/
https://blog.niclin.tw/2015/12/09/%E7%82%BA%E4%BB%80%E9%BA%BC-rails-%E8%A6%81%E5%88%86-production-test-development-%E4%B8%89%E7%A8%AE%E7%92%B0%E5%A2%83/
http://james1239090-blog.logdown.com/posts/773369-finish-the-rails-environment-development-test-production
https://openhome.cc/Gossip/Rails/Test.html