企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> Complication is What Happens When You Try to Solve a Problem You Don’t Understand - Andy Boothe 這一章我們走訪Rails的一些設定、Bundler,以及Command Line指令的用法。 ## 目錄結構 這一節讓我們走訪一個 Rails 的目錄結構: ### app/ app 目錄是你主要工作的地方,不同子目錄存放了 Models、Controllers、Views、Helpers 和 Assets 等檔案。 ### app/controllers Controller 的類別檔案存放在這裡 ### app/models Model 的類別檔案存放在這裡 ### app/views View 的樣本(template)檔案,依照不同 Controllers 分子目錄存放。 ### app/helpers Helper 一些在 Views 中可以使用的小方法,用來產生較複雜的 HTML。預設的 Helper 檔案命名是對應 Controller 的,不過並不強制,定義在任一個 Helper 檔案中的方法,都可以在任何 Views 中使用。 ### app/assets Assets 靜態檔案存放在這裡,包括有JavaScript、Stylesheets樣式表和Images圖檔。詳細的用法會在Assets一章中介紹。 ### config/ 雖然 Rails 的原則是慣例優於設定,不過還是有一些需要設定的地方。這個目錄下存放了例如資料庫設定檔 database.yml、路由設定 routes.rb、應用程式設定檔 application.rb 和不同執行環境的設定檔在 config/environments 目錄下。 ### db/ 資料庫 Schema(綱要) 和定義檔 migrations ### doc/ 你可以將你的文件放在這裡 ### lib/ 如果你有一些共用的類別或模組檔案,可以放在這裡,然後用require載入。例如一個放在lib/foobar.rb的類別或模組檔案,可以在要使用的.rb檔案中這樣載入: ~~~ require "foobar" ~~~ 如果放在子目錄lib/foo/bar.rb的話: ~~~ require "foo/bar" ~~~ ### lib/tasks Rake 任務檔案存放在這裡,我們會在 [Rails 錦囊妙計](https://ihower.tw/rails4/rails-recipes.html) 一章介紹 Rake。 ### log/ 不同執行環境的 log 檔案會分別記錄在這裡 ### public/ 這個目錄對 Web 伺服器來說,就是文件根目錄(document root),也就是唯一可以在網路上讀取到的目錄。 ### bin/ Rails 的腳本檔案,例如執行bin/rake。 ### test/ 單元測試、功能測試及整合測試的檔案。本書會改用RSpec做測試,所以這一個目錄會被砍掉。RSpec的測試檔案會放在spec/目錄下。 ### tmp/ 用來存放暫時用途的檔案 ### vendor/assets 可將第三方的CSS/JavaScript函式庫(沒有提供Gem安裝版本的)複製一份放在這裡。 ### 其他根目錄下的檔案 * config.ru 用來啟動應用程式的 Rack 設定檔 * Gemfile 設定你的 Rails 應用程式會使用哪些 Gems * README.rdoc 你的應用程式使用手冊。你可以用來告訴其他人你的應用程式是做什麼用的,如何使用等等。這會是Github上的專案首頁。 * Rakefile 用來載入可以被命令列執行的 Rake 任務 ## 多重環境 Rails 應用程式預設提供了三種不同的執行模式: * development environment 開發模式,用在你的開發的時候 * test environment 測試模式,用在執行測試程式時 * production environment 正式上線模式,用在實際的上線運作環境 不同環境的差異在於有不同的設定,除了資料庫設定 database.yml 裡分開設定之外,個別的環境設定放在 config/environments/development.rb、config/environments/test.rb 和 config/environments/production.rb,它們可以有不同的 Log 層級、Session 設定、Email 設定等等。除了預設的這三種模式,我們也可以自定模式,只需要建立對應的檔案即可,例如 config/environments/staging.rb。我們會在下一節詳述這些檔案裡面的設定。 > staging 可以用來表示準上線模式,用來做正式上線前的 QA 測試用途。 因為程式本身是不是寫死是哪一種執行模式,那麼要怎麼區分呢?根據不同情況有不同方法,包括: 根據環境變數 RAILS_ENV 或 RACK_ENV 來決定使用哪一種模式,例如使用rake時: ~~~ RAILS_ENV=production bin/rake db:migrate ~~~ 下一節會介紹的rails指令根據參數決定: ~~~ bin/rails console production bin/rails server -e production ~~~ 最後,應用程式伺服器則看伺服器設定檔,例如Passenger裡會設定`RackEnv`參數,佈署一章會詳細介紹。 ## Rails 指令 我們已經陸續使用過一些指令了,讓我們看看全部的指令吧: ### generate 可縮寫為 g 產生各種不同類型的檔案,例如 ~~~ bin/rails generate model person bin/rails g controller people ~~~ ### console 可縮寫為 c 開啟一個 Rails 主控台 ~~~ bin/rails console bin/rails c ~~~ 預設的環境是 developement,如果需要指定環境,請多輸入環境名稱即可,例如: ~~~ bin/rails c production ~~~ Rails也有提供沙箱模式(Sandbox),任何資料庫的修改都會在離開時回復(原理是資料庫Transaction): ~~~ bin/rails c --sandbox ~~~ 在主控台中輸入`exit`就會離開。 ### server 可縮寫為 s 開啟一個 Rails 伺服器 ~~~ bin/rails s ~~~ 預設是使用 Port 3000 和 development 環境,如果需要指定: ~~~ bin/rails s -p 4000 -e production ~~~ ### new 建立一個新 Rails 專案 ~~~ bin/rails new my_app ~~~ 將會建立一個叫做 MyApp 的 Rails 專案在 ./my_app 目錄下。加上`--database`參數可以改變設定檔的預設值,例如: ~~~ bin/rails new my_app --database=mysql ~~~ 其他說明可以輸入 rails 看到全部的指令。 ### 其他指令 * dbconsole 開起一個資料庫主控台 (可簡寫為 rails db),讓你直接輸入 SQL 指令。 * destroy 刪除 “generate” 所產生的檔案 * runner 在 Rails 環境中執行一段程式,例如 rails runner “puts Person.count” ## Rails 啟動與應用程式設定 > 不同的 Rails 版本產生的設定檔可能會略有差異,這些設定檔也沒有列出所有Rails設定,只有列出比較常用的。 啟動整個 Rails 程序(包括 rails server, rails runner, rails console 等) 時,會執行 application.rb 的應用程式設定,讓我們來看看這個檔案一些比較重要的部分吧。如果你對這個檔案有修改,無論在什麼模式下,都必須重新啟動 Rails 設定才會生效。 ~~~ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)' ~~~ 設定預設的應用程式時區,預設是 UTC。在 Rails 中,資料庫裡面儲存的時間皆為 UTC 時間,而設定此時區會自動幫你處理轉換動作。例如設定 Taipei 的話,從資料庫讀取出來時會自動加八小時,存進資料庫時會自動減八小時。 ~~~ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de ~~~ 設定預設的應用程式語系,預設是:en。我們會在”I18n 多國語系及時區”一章介紹如何使用。 ~~~ # Use SQL instead of Active Record's schema dumper when creating the database. # This is necessary if your schema can't be completely dumped by the schema dumper, # like if you have constraints or database-specific column types # config.active_record.schema_format = :sql ~~~ 每次跑測試的時候,為了節省建立資料庫的時間,預設的 schema_format = :ruby 會使用 schema.rb 而不是跑 Migrations。不過,schema.rb 沒辦法表達出特定資料庫所專屬的功能,像是觸發(triggers)或是預存程序(stored procedures)。所以如果你的 Migration 中有自定的 SQL 陳述句,請在這裡把 schema 的格式設定成 :sql。 > 改用 :sql 的話,Rails 會倒出現有的 development 資料庫,產生 #{Rails.env}_structure.sql 檔案來作為測試資料庫之用。 ### 其他初始設定檔(initialzers) 如果將所有的設定都放到 application.rb 就太混亂了,所以非 Rails 核心的設定,我們會放在config/initializers目錄下。這個目錄下的所有.rb檔案會在Rails啟動時都會自動載入執行。預設產生的檔案有五個: #### filter_parameter_logging ~~~ # Configure sensitive parameters which will be filtered from the log file. Rails.application.config.filter_parameters += [:password] ~~~ 設定 filter_paramsters 可以避免任何叫做 password 的參數值記錄到 log 中,有效防止使用者的原始密碼外洩到 log 檔案。 #### backtrace silencers 可以讓你選擇性地移除例外追蹤(exception backtrace)訊息,例如有些套件可能會很吵,妨礙你除錯。 #### inflections Rails 的命名慣例十分倚賴英文的單複數,例如將單數的類別名稱 Person 轉成複數的表格名稱 people。Inflector 就是負責將字串轉換成單複數的類別,雖然它內建了一些基本的轉換規格,但是英文常常有例外的時候,你可以在這個檔案中加上新的規格來做修正。如果你不太確定 Rails 轉換的對不對,請進入 console 主控台試試看: ~~~ $ rails c $ Loading development environment (Rails 3.2.8) $ > "Business".singularize => "Busines" # 轉單數 $ > "moose".pluralize => "mooses" # 轉複數 ~~~ 很不幸地這兩個例子 Rails 都沒轉對,這時候你就可以利用 inflections.rb 來修正。 > Rails 核心不接受有關單複數轉換的單字錯誤回報,畢竟它不是想做字典。 #### mime_types Rails 預設支援了如下常見的標準 MIME(Multipurpose Internet Mail Extensions) 格式,MIME 被用在 HTTP 通訊協定中的請求標頭 Accept 和回應標頭 Content-Type 中,來說明此文件的格式。例如 Accept:application/xml,application/xhtml+xml,text/html; 和 Content-Type:text/html; charset=UTF-8。而 Rails 會在 Controller 的 respond_to 方法中辨識並回應所請求的格式樣板,例如瀏覽器請求 application/xml 就會回應 xml 格式 | type/subtype | respond_to symbol | 別名/說明 | | text/html | :html, :xhtml | application/xhtml+xml | | text/plain | :text, :txt | | | text/javascript | :js | application/javascript, application/x-javascript | | text/css | :css | | | text/calendar | :ics | iCalendar 格式 | | text/csv | :csv | | | application/xml | :xml | text/xml, application/x-xml | | application/rss+xml | :rss | | | application/atom+xml | :atom | | | application/x-yaml | :yaml | text/yaml | | application/x-www-form-urlencoded | :url_encoded_form | 預設的 HTML forms 格式 | | multipart/form-data | :multipart_form | HTML forms 格式(包含二進位檔案資料) | | application/json | :json | text/x-json application/jsonrequest | 如果你需要客製,可以在這裡註冊。 #### sesssion_store Rails 預設使用了 Cookie 來儲存 Session 訊息。它會用上述的 key 編碼之後,直接存放在使用者瀏覽器 Cookie 上。除了 Cookie Session,我們也可以使用 ActiveRecord 儲存在資料庫中。我們會在 Controller 一章中詳細介紹及比較。 #### config/secrets.yml 這個設定檔包括了亂數產生的一組`secret_key_base`用來編碼需要保護的Cookie訊息。修改這組 key 會讓已經存放在使用者瀏覽器上的 Cookie Session 和 Signed Cookie 失效。你可以用來強制使用者需要重新登入。 ~~~ development: secret_key_base: 8dd8d723d33d474710ab65b.... some_api_key: SOMEKEY test: secret_key_base: 175fa99b200ba23cf82fec6c.... # Do not keep production secrets in the repository, # instead read values from the environment. production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> ~~~ 除了本來的`secret_key_base`之外,你也可以用這個檔案放其他設定,例如第三方應用的Key或Token。上述的例子透過`Rails.application.secrets.some_api_key`方法就會回傳`SOMEKEY`。 > 請小心這個檔案不要將`production`用的secret公開,例如上傳到Github的公開儲存庫。因為如果有人拿到`secret_key_base`那他就可以破解Rails預設的Cookie-based Session,造成安全上的嚴重漏洞。一般Production環境的作法是會將含有`production`完整設定的`config/secrets.yml`只放一份在伺服器上,或是透過環境變數來設定。詳細的作法可以參考佈署一章。 ## 環境設定檔 我們在上一節”多重環境設定”曾經介紹不同環境會有不同的設定檔,讓我們來更深入看看有哪些設定值,以及這些值是如果影響 Development、Production 和 Test 環境的不同: ### Development 模式 ~~~ # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.cache_classes = false ~~~ 使用 Rails 開發可以快速的原因之一,就是當你修改一個小東西,只要重新整理瀏覽器就可以馬上看到修改後的結果。這個秘訣就在於 cache_classes = false 會讓每一次的 HTTP 請求都重新載入類別檔案。更仔細的說,當這個值是 false 的時候,Rails 會改用 Ruby 的 load 方法,每次執行都會重新載入一次。相反地,如果這個值是 true,則會用 Ruby 的 require 方法,只會在第一次碰到的時候載入,之後碰到 require 相同的檔案,就會自動忽略,也就是說如果你啟動 Rails 後,檔案有修改想看到結果,必須重新啟動 Rails 才行,否則無法立即看到結果。 ~~~ # Show full error reports and disable caching config.consider_all_requests_local = true ~~~ Rails只有在連線是來自本地端的時候,才會將發生錯誤時的Call stack trace資訊給瀏覽器顯示。這個設定將所有連線都當做本地端連線,好讓開發模式時所有人連線都可以看到錯誤訊息。 ~~~ config.action_controller.perform_caching = false ~~~ 是否啟用 Controller 層級的快取(我們會在 Controller 一章介紹到有哪些快取方法),一般來說在開發模式不會啟用,除非你要測試它。 ~~~ # Don't care if the mailer can't send config.action_mailer.raise_delivery_errors = false ~~~ 如果寄信失敗,是否要丟出例外。建議可以改成 true。 > 建議可以在開發模式設定 config.action_mailer.perform_deliveries = false,這樣就不會真的寄信出去。我們會再 ActionMailer 一章詳細介紹如何實作寄信功能。 ~~~ # Print deprecation notices to the Rails logger config.active_support.deprecation = :log ~~~ 隨著 Rails 版本的升級,如果有方法會在之後的版本中移除,deprecation 會提示你如何因應。這裡的 :log 表示會記錄到 log 檔案中。 ### Production 模式 ~~~ # The production environment is meant for finished, "live" apps. # Code is not reloaded between requests config.cache_classes = true ~~~ cache_classes = true 表示在 production 中,類別檔案載入進記憶體中就快取起來了,大大獲得效能。不像在 development 環境中每一次 HTTP 請求就會重新載入一次。 ~~~ # Full error reports are disabled and caching is turned on config.consider_all_requests_local = false config.action_controller.perform_caching = true ~~~ 不同於 development,如果在 production 環境出現例外錯誤,不會顯示程式 call stack 訊息,而是回傳 public/500.html 頁面。 ~~~ # Disable Rails's static asset server (Apache or nginx will already do this) config.serve_static_assets = false ~~~ 不像 development 和 test,在這裡我們會讓 Rails 應用伺服器關掉對靜態檔案的回應。在 production 環境中,靜態檔案應該由效能極佳的 Apache 或 Nginx 網頁伺服器直接提供檔案。我們會在部署一章詳細介紹伺服器的架構。 ~~~ # Specifies the header that your server uses for sending files # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx ~~~ “X-Sendfile” 是網頁伺服器提供的功能,可以讓下載檔案的動作完全委派給網頁伺服器,Rails 送出 X-Sendfile 標頭後就毋需再佔住資源。 ~~~ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. # config.force_ssl = true ~~~ 是否限制全站必須SSL才能使用。 ~~~ # See everything in the log (default is :info) # config.log_level = :debug ~~~ 我們在 RESTful 應用程式 一章最後介紹了 Logger。這裡可以設定 Logger 的層級。預設 production 是 :info,其他則是 :debug ~~~ # Use a different logger for distributed setups # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) ~~~ 可以更換掉 Rails 內建的 Logger,例如換成使用 syslog 的 [SyslogLogger](http://seattlerb.rubyforge.org/SyslogLogger/)。 ~~~ # Use a different cache store in production # config.cache_store = :mem_cache_store ~~~ 設定不同的快取儲存庫,預設是 :memory_store,也就是每個 Rails process 各自用記憶體存放。業界最常用的則是 [memcached](http://memcached.org/) 記憶體快取伺服器。 ~~~ # Enable serving of images, stylesheets, and javascripts from an asset server # config.action_controller.asset_host = "http://assets.example.com" ~~~ 預設的靜態檔案位置是目前主機的 public 目錄,你可以透過修改 asset_host 變更位置。例如你的靜態檔案放在不同台機器或 CDN(Content delivery network) 上。 > 這就是為什麼 Rails 在 View 中會使用 Helper 方法的原因之一,我們不會平舖直敘的寫 ![](https://box.kancloud.cn/2015-08-18_55d2d3c597510.png),而是使用 目的就在於透過程式來獲得修改位置的彈性。其他還包括 stylesheets、javascripts 等靜態檔案都有 Helper 可以使用。 ~~~ # Disable delivery errors, bad email addresses will be ignored # config.action_mailer.raise_delivery_errors = false # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation can not be found) config.i18n.fallbacks = true ~~~ 如果 I18n 翻譯檔找不到,則找用預設語系的文字。我們會在I18n一章詳細介紹多國語系功能。 ~~~ # Send deprecation notices to registered listeners config.active_support.deprecation = :notify ~~~ 將 deprecation 訊息傳到 [Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html) 頻道,你可以用以下程式去訂閱這個訊息: ~~~ ActiveSupport::Notifications.subscribe("deprecation.rails") do |message, callstack| # deprecation message end ~~~ 如果沒有訂閱的話,就什麼事都不會發生。 ### Test 模式 ~~~ # Show full error reports and disable caching config.consider_all_requests_local = true config.action_controller.perform_caching = false # Raise exceptions instead of rendering exception templates config.action_dispatch.show_exceptions = false ~~~ 不同於 development 或 production 碰到例外會捕捉例外後,給瀏覽器顯示出 call stack trace 或 public/500.html 畫面,在 test 模式就不處理,讓例外直接爆出。 ~~~ # Tell Action Mailer not to deliver emails to the real world. # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array. config.action_mailer.delivery_method = :test ~~~ 測試模式下不會真的去寄送email ~~~ # Print deprecation notices to the stderr config.active_support.deprecation = :stderr ~~~ 讓 deprecation 訊息會直接顯示到視窗之中。 ### 資料庫設定檔 database.yml 幾乎每一個 Rails 應用程式都會與資料庫互動。而資料庫需要一個設定檔是 config/database.yml。如果你打開這個檔案,你會發現預設設定是 SQLite3。這個檔案包含三個不同的部分,對應到三個 Rails 預設環境。 一個 Mysql 的設定檔範例如下: ~~~ development: adapter: mysql encoding: utf8 database: blog_development username: root password: production: adapter: mysql encoding: utf8 database: blog_production username: root password: test: adapter: mysql encoding: utf8 database: blog_test username: root password: ~~~ ## Bundler 與 Gemfile 設定檔 Bundler [http://gembundler.com/](http://gembundler.com/) 是管理應用程式 Gem 依存性(dependencies)管理工具,它會根據 Gemfile 的設定自動下載及安裝 Gem 套件,並且幫你解決不同套件之間的依存關係,更重要的是,它可以讓不同開發者之間和佈署時,所有依存套件的版本都能夠一致。 在 Rails3 中 (Bundler 不只用在 Rails3,其他例如 Sinatra 或是 Rails2 也都可以使用) 要使用的 Gems,都必須宣告在 Gemfile 設定檔中,沒寫在裡面的話,就算手動 require 也找不到。這跟 Rails2 以前可以直接 require 任意 rubygems 不同,在使用 Bundler 的環境中,要 require 什麼 rubygems 必須透過 Gemfile 管理。 Gemfile 的寫法說明如下: ~~~ # 第二個參數可以指定版本 gem "rails", "4.2.1" # 也可以不指定版本,這樣會安裝最新的穩定版本 (不包括 .pre 或 .rc 結尾的版本) gem 'mysql2' # 如果 require 的檔名不同,可以加上 :require gem 'yajl-ruby', :require => 'yajl' # 可以用 Git 當做來源(根目錄要有 .gemspec 檔案),甚至可以指定 branch, tag 或 ref。 gem 'authlogic', :git => 'git://github.com/odorcicd/authlogic.git', :branch => 'rails3' # 也可以直接用電腦裡的其他目錄 # gem "rails", :path => '/Users/ihower/github/rails' # Group 功能可以讓特定環境才會載入 group :development, :test do gem "rspec", "~> 2.0" gem "rspec-rails", "~> 2.0" end ~~~ > 版號的指定方式除了指定特定版本,還可以指定大於等於 >= 某個版本。不過最建議的方式則是使用 ~> 的語法。”~> x.y.z” 的意思是版號 x,y 固定,但可以大於等於 z。例如 “~> 1.3.5” 的意思是 1.3.5, 1.3.6, 1.3.9 可以安裝,但是 1.4.0, 1.5.5, 2.0.1 就不行。這種寫法的好處是,通常版號的命名有其慣例:x major 版號升級表示有 API 發生不向後的相容性變動,y minor 版號升級表示有功能新增,z tiny 版號升級表示 bugs 修正。因此 “~> x.y.z” 可以讓我們保有升級彈性,又不致於升級太多讓程式發生不相容錯誤。 ### 安裝及更新 Gems 如果你修改了這個檔案,請執行 bundle install,這樣 Bundler 就會檢查並安裝這些函式庫,並產生一個 Gemfile.lock 檔案。Gemfile.lock 檔案會詳細列出所有使用到的套件版本,你應該把這個檔案也 commit 送進版本控制系統,這樣其他開發者及上線的版本就都會安裝完全一樣的版本了。 執行 bundle update gem_name 則會更新此 gem 的版本。bundle update 則會檢查所有的 gem 更新到最新版本。一般來說你只需要在每次 Gemfile 修改後,執行 bundle install 即可。如果有套件關連性 bundle install 無法解決,它會提示你執行 bundle update。 什麼時候該執行 bundle install 或 bundle update 呢?一般來說,總是執行 bundle install 即可。這個指令只會做必要的更新到 Gemfile.lock,執行速度較快,它不會幫你升級現有的 Gem。而 bundle update 會重新產生整個 Gemfile.lock 檔案,更新所有 Gem 到最新版本。但是,一次升級太多套件,可能會造成除錯上的困難。因此會建議如果要升級,請執行 bundle update gem_name 一次升級一個套件。 怎麼知道可以升級哪些Gem呢? ~~~ bundle outdated ~~~ 這個指令就會列出有新版本可以升級的gems。 ### 打包 Gems 執行以下指令,會將所有用到的 Gems 打包進 vendor/cache 目錄。如此執行 bundle install 時就不會連線到 http://rubygems.org 下載套件。 ~~~ bundle package ~~~ 什麼時候需要用到這個功能呢?例如你希望佈署的時候避免外部連線,或是你有非公開的 gems 不會上傳到 http://rubygems.org 網站上。 > 如果你有非 Rails 的 script 需要執行(也就是放在 Gemfile 檔案中的 Gem 所自行提供的執行檔),使用 bundle exec 可以正確的載入 Bundler 的環境。例如 bundle exec rspec spec/ ## 名稱慣例 在 Rails 中有一些命名上的慣例: ### 類別命名與自動載入 檔名使用小寫、單數,用底線區隔。例如當 Rails 看到一個 OrderItem 的類別或模組(Module),它會在 autoload_paths (我們在 config/application.rb 中有此項設定) 目錄中自動去載入叫做 order_item.rb 的檔案,也就是 require “order_item”。 如果是有嵌套的類別或模組,例如 Admin::OrderItem,則會多一層目錄,它會自動載入 admin/order_item.rb 的檔案,也就是 require “admin/order_item”。 > 如果你沒有設定 autoload_paths 加入 lib 目錄,或是你的檔案沒有依照慣例命名,那麼你會需要在程式中手動 require 它。基本上,只要依照命名慣例,你不太需要在程式中寫 require。 > autoload_paths 目錄是指 Rails 會自動根據命名慣例載入,而 Ruby 的 $LOAD_PATH 常數則是 require 時會尋找的目錄。像 lib 這個目錄 Rails 預設就只有加到 $LOAD_PATH 之中,所以你放在 lib 的檔案是可以 require 到,但是因為預設沒有加到 autoload_paths 之中,所以沒有自動載入的機制。 ### Model 命名 類別名稱使用大寫、單數,沒有底線。而檔名使用小寫、單數,用底線。資料庫表格名稱用小寫且為複數。例如: * 資料庫表格 line_items * 檔名 app/models/line_item.rb * 類別名稱 LineItem ### Controller 命名 假設有一個stores controller的話: * 檔名 app/controllers/stores_controller.rb * 類別名稱 StoresController 如果需要將controllers檔案做分類,這時候可以使用Module,將檔案放在子目錄下,例如後台專用的controllers: * 檔名 app/controllers/admin/stores_controller.rb * 類別名稱 Admin::StoresController ### View 命名 例如一個叫做 People 的 controller,其中的 index action: * 檔名 app/views/people/index.html.erb * Helper 名稱 module PeopleHelper * 檔名 app/helpers/people_helper.rb ## Rails 元件導覽 Rails 包含許多個別的函式庫元件: * Action Pack * Action Controller * Action Dispatch * Action View * Action Mailer * Active Model * Active Record * Active Support * Railties ### Action Pack Action Pack 是個包含 Action Controller、Action View 和 Action Dispatch 的 gem。也就是 “MVC” 中的 “VC” 部分。 ### Action Controller Action Controller 是 Rails 應用程式中,管理 Controllers 的元件。Action Controller 框架處理傳給 Rails 的 HTTP 請求,萃取出參數,然後分派給所屬的 Action。Action Controller 還提供了 session 管理、樣板演算顯示(template rendering) 和 redirect 功能。 ### Action View Action View 負責 Rails 應用程式中的 Views。它預設可以產生 HTML 或 XML 輸出。Action View 負責樣板的演算顯示(template rendering),包括嵌套(nesting)或局部(partial)樣板,甚至也內建支援一些 Ajax。 ### Action Dispatch Action Dispatch 處理 HTTP 請求的路由(routing),它把 HTTP 請求發派(dispatch)到它該去的地方,也許是你的應用程式或其他 Rack 程式。 ### Action Mailer Action Mailer 是個建構 E-mail 功能的框架。你可以使用 Action Mailer 來接收來信,或是使用樣板來寄出純文字或複雜的 multipart 信件。 ### Active Model Active Model 在 Action Pack gem 和 ORM gem (例如 Active Record) 之間定義了一組介面。Active Model 允許 Rails 可以依你的需求把 Active Record 換成其他 ORM 框架。 ### Active Record Active Record 是 Rails 應用程式中的 Models 基礎。它不依存特定的資料庫系統,提供了 CRUD 功能、先進的查詢能力以及可以跟其他 Models 關聯的本事。 ### Active Support Active Support 是 Rails 裡的工具函式庫,它也擴充了一些 Ruby 標準函式庫。除了被用在 Rails 核心程式中,你也可以在你的程式中使用。 ### Railties Railties 是 Rails 的核心程式碼,用來把以上各種的框架函式庫以及 Plugin 全部組合在一起。 ## 更多線上資源 * [Configuring Rails Applications](http://edgeguides.rubyonrails.org/configuring.html) * [A Guide to The Rails Command Line](http://edgeguides.rubyonrails.org/command_line.html)