日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

rails 代码结构详解

發(fā)布時(shí)間:2023/12/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rails 代码结构详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄結(jié)構(gòu)

這一節(jié)讓我們走訪一個(gè) Rails的目錄結(jié)構(gòu):

app/

app 目錄是你主要工作的地方,不同子目錄存儲(chǔ)了 ModelsControllersViewsHelpers Assets 等檔案。

app/controllers

Controller 的類別檔案存放在這里

app/models

Model 的類別檔案存放在這里

app/views

View 的樣本(template)檔案,依照不同Controllers分子目錄存儲(chǔ)。

app/helpers

Helper 一些在 Views中可以使用的小方法,用來(lái)產(chǎn)生較復(fù)雜的 HTML。默認(rèn)的Helper檔案命名是對(duì)應(yīng) Controller的,不過(guò)并不強(qiáng)制,定義在任一個(gè) Helper檔案中的方法,都可以在任何 Views中使用。

app/assets

Assets 靜態(tài)檔案存放在這里,包括有JavaScriptStylesheets樣式表單和Images圖檔。詳細(xì)的用法會(huì)在Assets一章中介紹。

config/

雖然 Rails的原則是慣例優(yōu)于設(shè)定,不過(guò)還是有一些需要設(shè)定的地方。這個(gè)目錄下存放了例如數(shù)據(jù)庫(kù)配置文件 database.yml、路由設(shè)定routes.rb、應(yīng)用程序配置文件 application.rb 和不同執(zhí)行環(huán)境的配置文件在 config/environments目錄下。

db/

數(shù)據(jù)庫(kù) Schema(綱要)和定義檔 migrations

doc/

你可以將你的文件放在這里

lib/

如果你有一些共享的類別或模塊檔案,可以放在這里,然后用require加載。例如一個(gè)放在lib/foobar.rb的類別或模塊檔案,可以在要使用的.rb檔案中這樣加載:

require "foobar"

如果放在子目錄lib/foo/bar.rb的話:

require "foo/bar"

lib/tasks

Rake 任務(wù)檔案存放在這里,我們會(huì)在Rails錦囊妙計(jì)一章介紹 Rake

log/

不同執(zhí)行環(huán)境的 log檔案會(huì)分別記錄在這里

public/

這個(gè)目錄對(duì) Web服務(wù)器來(lái)說(shuō),就是文件根目錄(document root),也就是唯一可以在網(wǎng)絡(luò)上讀取到的目錄。

script/

Rails 的腳本檔案

test/

單元測(cè)試、功能測(cè)試及整合測(cè)試的檔案

tmp/

用來(lái)存放暫時(shí)用途的檔案

vendor/

第三方函式庫(kù)或 Plugin套件會(huì)放在這里

其他根目錄下的檔案

  • config.ru 用來(lái)啟動(dòng)應(yīng)用程序的 Rack配置文
  • Gemfile 設(shè)定你的 Rails應(yīng)用程序會(huì)使用哪些 Gems
  • README.rdoc 你的應(yīng)用程序使用手冊(cè)。你可以用來(lái)告訴其他人你的應(yīng)用程序是做什么用的,如何使用等等
  • Rakefile 用來(lái)加載可以被命令行執(zhí)行的 Rake務(wù)
  • 多重環(huán)境

    Rails 應(yīng)用程序默認(rèn)提供了三種不同的執(zhí)行模式:

  • developmentenvironment 開發(fā)模式,用在你的開發(fā)的時(shí)
  • test environment 測(cè)試模式,用在執(zhí)行測(cè)試程序時(shí)
  • production environment正式上線模式,用在實(shí)際的上線運(yùn)作環(huán)
  • 不同環(huán)境的差異在于有不同的設(shè)定,除了數(shù)據(jù)庫(kù)設(shè)定database.yml里分開設(shè)定之外,個(gè)別的環(huán)境設(shè)定放在config/environments/development.rbconfig/environments/test.rbconfig/environments/production.rb,它們可以有不同的 Log 層級(jí)、Session設(shè)定、Email 設(shè)定等等。除了默認(rèn)的這三種模式,我們也可以自定模式,只需要建立對(duì)應(yīng)的檔案即可,例如 config/environments/staging.rb。我們會(huì)在下一節(jié)詳述這些檔案里面的設(shè)定。

    staging 可以用來(lái)表示準(zhǔn)上線模式,用來(lái)做正式上線前的 QA測(cè)試用途

    因?yàn)槌绦虮旧硎遣皇菍懰朗悄囊环N執(zhí)行模式,那么要怎么區(qū)分呢?根據(jù)不同情況有不同方法,包括:

    根據(jù)環(huán)境變量 RAILS_ENV RACK_ENV 來(lái)決定使用哪一種模式,例如使用rake時(shí):

    RAILS_ENV=production rake db:migrate

    下一節(jié)會(huì)介紹的rails指令根據(jù)參數(shù)決定:

    rails console production rails server -e production

    最后,應(yīng)用程序服務(wù)器則看服務(wù)器配置文件,例如Passenger里會(huì)設(shè)定RackEnv參數(shù),布署一章會(huì)詳細(xì)介紹。

    Rails 指令

    我們已經(jīng)陸續(xù)使用過(guò)一些指令了,讓我們看看全部的指令吧:

    generate 可縮寫為 g

    產(chǎn)生各種不同類型的檔案,例如

    rails generate model person rails g controller people

    console 可縮寫為 c

    開啟一個(gè) Rails控制臺(tái)

    rails console rails c

    默認(rèn)的環(huán)境是 developement,如果需要指定環(huán)境,請(qǐng)多輸入環(huán)境名稱即可,例如:

    rails c production

    Rails也有提供沙盒模式(Sandbox),任何數(shù)據(jù)庫(kù)的修改都會(huì)在離開時(shí)回復(fù)(原理是數(shù)據(jù)庫(kù)Transaction)

    rails c --sandbox

    在控制臺(tái)中輸入exit就會(huì)離開。

    server 可縮寫為 s

    開啟一個(gè) Rails服務(wù)器

    rails s

    默認(rèn)是使用 Port 3000 development 環(huán)境,如果需要指定:

    rails s -p 4000 -e production

    new

    建立一個(gè)新 Rails項(xiàng)目

    rails new my_app

    將會(huì)建立一個(gè)叫做 MyApp Rails 項(xiàng)目在./my_app 目錄下。加上--database參數(shù)可以改變配置文件的默認(rèn)值,例如:

    rails new my_app --database=mysql

    其他說(shuō)明可以輸入 rails看到全部的指令。

    其他指令

  • dbconsole 開起一個(gè)數(shù)據(jù)庫(kù)控制臺(tái) (可簡(jiǎn)寫為 rails db),讓你直接輸入 SQL 指令
  • destroy 刪除 “generate”所產(chǎn)生的檔
  • benchmarker 產(chǎn)生 benchmark信息,我們會(huì)在性能一章介紹如何使
  • profiler 產(chǎn)生 profiler信息,我們會(huì)在性能一章介紹如何使
  • runner Rails環(huán)境中執(zhí)行一段程序,例如 rails runner “puts Person.count”
  • Rails 啟動(dòng)與應(yīng)用程序設(shè)定

    不同的 Rails版本產(chǎn)生的配置文件可能會(huì)略有差異,這些配置文件也沒有列出所有Rails設(shè)定,只有列出比較常用的

    啟動(dòng)整個(gè) Rails程序(包括 rails server, rails runner,rails console) 時(shí),會(huì)執(zhí)行 application.rb的應(yīng)用程序設(shè)定,讓我們來(lái)看看這個(gè)檔案一些比較重要的部分吧。如果你對(duì)這個(gè)檔案有修改,無(wú)論在什么模式下,都必須重新啟動(dòng) Rails設(shè)定才會(huì)生效。

    # Custom directories with classes and modules you want to be autoloadable. # config.autoload_paths += %W(#{config.root}/extras)

    任何放在 app/modelsapp/controllers目錄下的類別檔案,Rails 都會(huì)根據(jù)類別的命名慣例來(lái)自動(dòng)加載。如果你有其他類別檔案需要加載,請(qǐng)?jiān)谶@個(gè)設(shè)定加入。例如通常我們會(huì)加入

    config.autoload_paths += %W( #{config.root}/app/lib )

    如果app/models下的檔案太多,我們可以很簡(jiǎn)單地增加新的子目錄來(lái)做分類,例如我們可以將檔案直接搬到 app/models/foobar子目錄下(程序內(nèi)容無(wú)需修改),然后將這個(gè)目錄加進(jìn) autoload_paths即可,例如 config.autoload_paths +=%W( #{config.root}/app/lib #{config.root}/app/models/foobar)。這里的 %W Ruby 的數(shù)組簡(jiǎn)寫用法

    # Activate observers that should always be running. # config.active_record.observers = :cacher, :garbage_collector, :forum_observer

    設(shè)定 ActiveRecord的觀察者類別,我們會(huì)在 ActiveRecord章節(jié)詳述這個(gè)模式,簡(jiǎn)單來(lái)說(shuō),它會(huì)在 ActiveRecord數(shù)據(jù)變動(dòng)時(shí)執(zhí)行外部回呼,例如清除快取。

    # 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)'

    設(shè)定默認(rèn)的應(yīng)用程序時(shí)區(qū),默認(rèn)是 UTC。在 Rails中,數(shù)據(jù)庫(kù)里面儲(chǔ)存的時(shí)間皆為 UTC時(shí)間,而設(shè)定此時(shí)區(qū)會(huì)自動(dòng)幫你處理轉(zhuǎn)換動(dòng)作。例如設(shè)定 Taipei的話,從數(shù)據(jù)庫(kù)讀取出來(lái)時(shí)會(huì)自動(dòng)加八小時(shí),存進(jìn)數(shù)據(jù)庫(kù)時(shí)會(huì)自動(dòng)減八小時(shí)。

    # 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

    設(shè)定默認(rèn)的應(yīng)用程序語(yǔ)系,默認(rèn)是:en。我們會(huì)在”I18n多國(guó)語(yǔ)系及時(shí)區(qū)一章介紹如何使用。

    # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password]

    設(shè)定 filter_paramsters可以避免任何叫做 password的參數(shù)值記錄到log 中,有效防止用戶的原始密碼外泄到 log 檔案。

    # 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

    每次跑測(cè)試的時(shí)候,為了節(jié)省建立數(shù)據(jù)庫(kù)的時(shí)間,默認(rèn)的schema_format = :ruby會(huì)使用 schema.rb 而不是跑 Migrations。不過(guò),schema.rb沒辦法表達(dá)出特定數(shù)據(jù)庫(kù)所專屬的功能,像是外部鍵約束(foreignkey constraints)、觸發(fā)(triggers)或是預(yù)存程序(stored procedures)。所以如果你的Migration中有自定的 SQL 陳述句,請(qǐng)?jiān)谶@里把 schema 的格式設(shè)定成:sql

    改用:sql的話,Rails 會(huì)倒出現(xiàn)有的 development 數(shù)據(jù)庫(kù),產(chǎn)生#{Rails.env}_structure.sql檔案來(lái)作為測(cè)試數(shù)據(jù)庫(kù)之用

    # Enforce whitelist mode for mass assignment. # This will create an empty whitelist of attributes available for mass-assignment for all models # in your app. As such, your models will need to explicitly whitelist or blacklist accessible # parameters by using an attr_accessible or attr_protected declaration. config.active_record.whitelist_attributes = true ? 預(yù)設(shè)打開*Mass assignment*的白名單設(shè)定,詳見安全性一章

    其他初始配置文件(initialzers)

    如果將所有的設(shè)定都放到 application.rb就太混亂了,所以非 Rails核心的設(shè)定,我們會(huì)放在config/initializers目錄下。這個(gè)目錄下的所有.rb檔案會(huì)在Rails啟動(dòng)時(shí)都會(huì)自動(dòng)加載執(zhí)行。默認(rèn)產(chǎn)生的檔案有五個(gè):

    backtrace silencers

    可以讓你選擇性地移除例外追蹤(exceptionbacktrace)訊息,例如有些套件可能會(huì)很吵,妨礙你除錯(cuò)。

    inflections

    Rails 的命名慣例十分倚賴英文的單復(fù)數(shù),例如將單數(shù)的類別名稱 Person轉(zhuǎn)成復(fù)數(shù)的表格名稱peopleInflector就是負(fù)責(zé)將字符串轉(zhuǎn)換成單復(fù)數(shù)的類別,雖然它內(nèi)建了一些基本的轉(zhuǎn)換規(guī)格,但是英文常常有例外的時(shí)候,你可以在這個(gè)檔案中加上新的規(guī)格來(lái)做修正。如果你不太確定 Rails轉(zhuǎn)換的對(duì)不對(duì),請(qǐng)進(jìn)入console控制臺(tái)試試看:

    $ rails c $ Loading development environment (Rails 3.2.8) $ > "Business".singularize? => "Busines" # 轉(zhuǎn)單數(shù) $ > "moose".pluralize => "mooses"? # 轉(zhuǎn)複數(shù)

    很不幸地這兩個(gè)例子 Rails都沒轉(zhuǎn)對(duì),這時(shí)候你就可以利用 inflections.rb來(lái)修正。

    Rails 核心不接受有關(guān)單復(fù)數(shù)轉(zhuǎn)換的單字錯(cuò)誤回報(bào),畢竟它不是想做字典

    mime_types

    Rails 默認(rèn)支持了如下常見的標(biāo)準(zhǔn) MIME(Multipurpose Internet Mail Extensions)格式,MIME 被用在 HTTP 通訊協(xié)議中的請(qǐng)求標(biāo)頭 Accept和響應(yīng)標(biāo)頭Content-Type中,來(lái)說(shuō)明此文件的格式。例如Accept:application/xml,application/xhtml+xml,text/html; Content-Type:text/html; charset=UTF-8。而 Rails會(huì)在Controller respond_to 方法中辨識(shí)并響應(yīng)所請(qǐng)求的格式樣板,例如瀏覽器請(qǐng)求 application/xml就會(huì)響應(yīng)xml 格式

    type/subtype

    respond_to symbol

    別名/說(shuō)明

    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

    默認(rèn)的 HTML forms 格式

    multipart/form-data

    :multipart_form

    HTML forms 格式(包含二進(jìn)制文件數(shù)據(jù))

    application/json

    :json

    text/x-json application/jsonrequest

    如果你需要客制,可以在這里注冊(cè)。

    secret_token

    這個(gè)檔案包括了隨機(jī)數(shù)生成的一組 key用來(lái)編碼需要保護(hù)的 Cookie訊息(例如下述的 Cookie session)。修改這組key會(huì)讓已經(jīng)存放在用戶瀏覽器上的 Cookie Session Signed Cookie失效。你可以用來(lái)強(qiáng)制用戶需要重新登入。

    sesssion_store

    Rails 默認(rèn)使用了 Cookie來(lái)儲(chǔ)存Session 訊息。它會(huì)用上述的 key 編碼之后,直接存放在用戶瀏覽器 Cookie上。除了Cookie Session,我們也可以使用 ActiveRecord儲(chǔ)存在數(shù)據(jù)庫(kù)中。我們會(huì)在 Controller一章中詳細(xì)介紹及比較。

    環(huán)境配置文件

    我們?cè)谏弦还?jié)多重環(huán)境設(shè)定曾經(jīng)介紹不同環(huán)境會(huì)有不同的配置文件,讓我們來(lái)更深入看看有哪些設(shè)定值,以及這些值是如果影響 DevelopmentProduction Test環(huán)境的不同:

    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 webserver when you make code changes. config.cache_classes = false

    使用 Rails開發(fā)可以快速的原因之一,就是當(dāng)你修改一個(gè)小東西,只要重新整理瀏覽器就可以馬上看到修改后的結(jié)果。這個(gè)秘訣就在于 cache_classes = false會(huì)讓每一次的 HTTP 請(qǐng)求都重載類別檔案。更仔細(xì)的說(shuō),當(dāng)這個(gè)值是 false的時(shí)候,Rails會(huì)改用 Ruby load 方法,每次執(zhí)行都會(huì)重載一次。相反地,如果這個(gè)值是 true,則會(huì)用 Ruby require 方法,只會(huì)在第一次碰到的時(shí)候加載,之后碰到 require相同的檔案,就會(huì)自動(dòng)忽略,也就是說(shuō)如果你啟動(dòng) Rails后,檔案有修改想看到結(jié)果,必須重新啟動(dòng) Rails才行,否則無(wú)法立即看到結(jié)果。

    # Log error messages when you accidentally call methods on nil. config.whiny_nils = true

    當(dāng)你對(duì) nil呼叫方法時(shí),會(huì)出現(xiàn) NoMethodErrorwhiny_nils= true會(huì)提示你更多訊息來(lái)除錯(cuò)。這個(gè)值在 production默認(rèn)是 false

    # Show full error reports and disable caching config.consider_all_requests_local = true

    Rails只有在聯(lián)機(jī)是來(lái)自本地端的時(shí)候,才會(huì)將發(fā)生錯(cuò)誤時(shí)的Callstack trace信息給瀏覽器顯示。這個(gè)設(shè)定將所有聯(lián)機(jī)都當(dāng)做本地端聯(lián)機(jī),好讓開發(fā)模式時(shí)所有人聯(lián)機(jī)都可以看到錯(cuò)誤訊息。

    config.action_controller.perform_caching = false

    是否啟用 Controller層級(jí)的快取(我們會(huì)在 Controller一章介紹到有哪些快取方法),一般來(lái)說(shuō)在開發(fā)模式不會(huì)啟用,除非你要測(cè)試它。

    # Don't care if the mailer can't send config.action_mailer.raise_delivery_errors = false

    如果寄信失敗,是否要丟出例外。建議可以改成 true

    建議可以在開發(fā)模式設(shè)定 config.action_mailer.perform_deliveries = false,這樣就不會(huì)真的寄信出去。我們會(huì)再 ActionMailer一章詳細(xì)介紹如何實(shí)現(xiàn)寄信功能

    # Print deprecation notices to the Rails logger config.active_support.deprecation = :log

    隨著 Rails版本的升級(jí),如果有方法會(huì)在之后的版本中移除,deprecation會(huì)提示你如何因應(yīng)。這里的 :log表示會(huì)記錄到log 檔案中。

    # Only use best-standards-support built into browsers config.action_dispatch.best_standards_support = :builtin

    Rails會(huì)在HTTP Header中加上X-UA-Compatible屬性,這個(gè)屬性可以用來(lái)告訴IE瀏覽器去支持最新網(wǎng)頁(yè)標(biāo)準(zhǔn),而不是兼容模式。在這里開發(fā)模式中這里設(shè)成:builtin的意思是IE=edge,而在production模式中默認(rèn)是true,意思是IE=edge,chrome=1,多啟用了Chrome Frame,如果用戶有裝ChromeFrame,就可以讓舊版IE瀏覽器使用ChromeWebKit引擎來(lái)處理網(wǎng)頁(yè),讓舊版IE也可以使用到現(xiàn)代網(wǎng)頁(yè)技術(shù)。

    http://code.google.com/chrome/chromeframe/

    # Log the query plan for queries taking more than this (works # with SQLite, MySQL, and PostgreSQL) config.active_record.auto_explain_threshold_in_seconds = 0.5

    當(dāng)SQL查詢超過(guò)0.5秒時(shí),自動(dòng)做SQLexplainLog里。

    # Do not compress assets config.assets.compress = false ? # Expands the lines which load the assets config.assets.debug = true

    以上這兩行Asset Pipeline的設(shè)定會(huì)在Asset一章中介紹。

    Production 模式

    # The production environment is meant for finished, "live" apps. # Code is not reloaded between requests config.cache_classes = true

    cache_classes = true 表示在 production 中,類別檔案加載進(jìn)內(nèi)存中就快取起來(lái)了,大大獲得性能。不像在 development環(huán)境中每一次HTTP 請(qǐng)求就會(huì)重載一次。

    # Full error reports are disabled and caching is turned on config.consider_all_requests_local?????? = false config.action_controller.perform_caching = true

    不同于 development,如果在 production環(huán)境出現(xiàn)例外錯(cuò)誤,不會(huì)顯示程序 call stack訊息,而是回傳public/500.html頁(yè)面。

    # Disable Rails's static asset server (Apache or nginx will already do this) config.serve_static_assets = false

    不像 development test,在這里我們會(huì)讓Rails應(yīng)用服務(wù)器關(guān)掉對(duì)靜態(tài)檔案的響應(yīng)。在 production環(huán)境中,靜態(tài)檔案應(yīng)該由性能極佳的 Apache Nginx 網(wǎng)頁(yè)服務(wù)器直接提供檔案。我們會(huì)在部署一章詳細(xì)介紹服務(wù)器的架構(gòu)。

    # Disable Rails's static asset server (Apache or nginx will already do this) config.serve_static_assets = false ? # Compress JavaScripts and CSS config.assets.compress = true ? # Don't fallback to assets pipeline if a precompiled asset is missed config.assets.compile = false ? # Generate digests for assets URLs config.assets.digest = true ? # Defaults to nil and saved in location specified by config.assets.prefix # config.assets.manifest = YOUR_PATH ? # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) # config.assets.precompile += %w( search.js )

    這幾個(gè)設(shè)定會(huì)在Assets一章中介紹。

    # 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” 是網(wǎng)頁(yè)服務(wù)器提供的功能,可以讓下載文件的動(dòng)作完全委派給網(wǎng)頁(yè)服務(wù)器,Rails送出X-Sendfile 標(biāo)頭后就毋需再占住資源。

    # 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

    我們?cè)?/span> RESTful應(yīng)用程序一章最后介紹了Logger。這里可以設(shè)定 Logger的層級(jí)。默認(rèn) production:info,其他則是 :debug

    # Use a different logger for distributed setups # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)

    可以更換掉 Rails內(nèi)建的 Logger,例如換成使用syslogSyslogLogger

    # Use a different cache store in production # config.cache_store = :mem_cache_store

    設(shè)定不同的快取儲(chǔ)存庫(kù),默認(rèn)是 :memory_store,也就是每個(gè) Rails process各自用內(nèi)存存放。業(yè)界最常用的則是memcached內(nèi)存快取服務(wù)器。

    # Enable serving of images, stylesheets, and javascripts from an asset server # config.action_controller.asset_host = "http://assets.example.com"

    默認(rèn)的靜態(tài)檔案位置是目前主機(jī)的 public目錄,你可以透過(guò)修改 asset_host變更位置。例如你的靜態(tài)檔案放在不同臺(tái)機(jī)器或 CDN(Content delivery network)上。

    這就是為什么 Rails View 中會(huì)使用 Helper方法的原因之一,我們不會(huì)平鋪直敘的寫,而是使用 <%= image_tag(“rails.png”) %>目的就在于透過(guò)程序來(lái)獲得修改位置的彈性。其他還包括 stylesheetsjavascripts等靜態(tài)檔案都有 Helper可以使用

    # Disable delivery errors, bad email addresses will be ignored # config.action_mailer.raise_delivery_errors = false ? # Enable threaded mode # config.threadsafe!

    雖然 Rails支持 thread-safe 模式,不過(guò)這里默認(rèn)是關(guān)閉的。Ruby 1.8 thread 由于不是操作系統(tǒng)層級(jí)的 thread,并不會(huì)真的使用到多顆CPURuby 1.9雖然是,但是因?yàn)槟承﹥?nèi)部函數(shù)庫(kù)不 thread-safe,所以多thread實(shí)際上也是跑在同一顆 CPU。因此,啟用 threaded模式獲得的性能改善有限,但是設(shè)定上卻麻煩的多,例如你無(wú)法使用 Rails的自動(dòng)加載類別功能。你也無(wú)法在 development環(huán)境中打開。實(shí)務(wù)上我們會(huì)在服務(wù)器上執(zhí)行多個(gè) Rails process,因此不需要也不建議打開 threaded模式。

    如果您是使用 JRuby,受益于 Java VM強(qiáng)大的 Thread 實(shí)現(xiàn),那么就有值得打開 threaded 模式的理由

    # 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翻譯檔找不到,則找用默認(rèn)語(yǔ)系的文字。我們會(huì)在I18n一章詳細(xì)介紹多國(guó)語(yǔ)系功能。

    # Send deprecation notices to registered listeners config.active_support.deprecation = :notify

    deprecation訊息傳到Notifications頻道,你可以用以下程序去訂閱這個(gè)訊息:

    ActiveSupport::Notifications.subscribe("deprecation.rails") do |message, callstack| ? # deprecation message end

    如果沒有訂閱的話,就什么事都不會(huì)發(fā)生。

    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 碰到例外會(huì)捕捉例外后,給瀏覽器顯示出 call stack tracepublic/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

    測(cè)試模式下不會(huì)真的去寄送email

    # Print deprecation notices to the stderr config.active_support.deprecation = :stderr

    deprecation訊息會(huì)直接顯示到窗口之中。

    數(shù)據(jù)庫(kù)配置文件 database.yml

    幾乎每一個(gè) Rails應(yīng)用程序都會(huì)與數(shù)據(jù)庫(kù)互動(dòng)。而數(shù)據(jù)庫(kù)需要一個(gè)配置文件是 config/database.yml。如果你打開這個(gè)檔案,你會(huì)發(fā)現(xiàn)默認(rèn)設(shè)定是 SQLite3。這個(gè)檔案包含三個(gè)不同的部分,對(duì)應(yīng)到三個(gè) Rails 默認(rèn)環(huán)境。

    一個(gè) 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/是管理應(yīng)用程序 Gem 相關(guān)性(dependencies)管理工具,它會(huì)根據(jù) Gemfile的設(shè)定自動(dòng)下載及安裝Gem 套件,并且?guī)湍憬鉀Q不同套件之間的依存關(guān)系,更重要的是,它可以讓不同開發(fā)者之間和布署時(shí),所有依存套件的版本都能夠一致。

    Rails3 (Bundler 不只用在Rails3,其他例如 Sinatra或是 Rails2 也都可以使用) 要使用的 Gems,都必須宣告在Gemfile配置文件中,沒寫在里面的話,就算手動(dòng) require也找不到。這跟 Rails2 以前可以直接require 任意 rubygems不同,在使用 Bundler 的環(huán)境中,要require 什么 rubygems必須透過(guò) Gemfile 管理。

    Gemfile 的寫法說(shuō)明如下:

    ? # 第二個(gè)參數(shù)可以指定版本 ? gem "rails", "3.2.8" ? ? # 也可以不指定版本,這樣會(huì)安裝最新的穩(wěn)定版本 (不包括 .pre .rc 結(jié)尾的版本) ? gem 'mysql2' ? ??# 如果 require 的檔名不同,可以加上 :require ? gem 'yajl-ruby', :require => 'yajl' ? ? # 可以用 Git 當(dāng)做來(lái)源(根目錄要有 .gemspec 檔案),甚至可以指定 branch, tag ref ? gem 'authlogic', :git => 'git://github.com/odorcicd/authlogic.git', ??????????????????????????? :branch => 'rails3' ? ? # 也可以直接用電腦裡的其他目錄 ? # gem "rails", :path => '/Users/ihower/github/rails' ? ? # Group 功能可以讓特定環(huán)境才會(huì)載入 ? group :development, :test do ???? gem "rspec", "~> 2.0" ???? gem "rspec-rails", "~> 2.0" ? end

    版號(hào)的指定方式除了指定特定版本,還可以指定大于等于 >=某個(gè)版本。不過(guò)最建議的方式則是使用 ~>的語(yǔ)法。”~> x.y.z” 的意思是版號(hào) x,y 固定,但可以大于等于 z。例如 “~> 1.3.5”的意思是 1.3.5, 1.3.6, 1.3.9可以安裝,但是 1.4.0, 1.5.5, 2.0.1就不行。這種寫法的好處是,通常版號(hào)的命名有其慣例:x major版號(hào)升級(jí)表示有 API 發(fā)生不向后的兼容性變動(dòng),y minor 版號(hào)升級(jí)表示有功能新增,z tiny 版號(hào)升級(jí)表示 bugs 修正。因此 “~> x.y.z”可以讓我們保有升級(jí)彈性,又不致于升級(jí)太多讓程序發(fā)生不兼容錯(cuò)誤

    安裝及更新 Gems

    如果你修改了這個(gè)檔案,請(qǐng)執(zhí)行 bundle install,這樣 Bundler就會(huì)檢查并安裝這些函式庫(kù),并產(chǎn)生一個(gè) Gemfile.lock檔案。Gemfile.lock檔案會(huì)詳細(xì)列出所有使用到的套件版本,你應(yīng)該把這個(gè)檔案也commit送進(jìn)版本控制系統(tǒng),這樣其他開發(fā)者及上線的版本就都會(huì)安裝完全一樣的版本了。

    執(zhí)行 bundle update gem_name則會(huì)更新此 gem 的版本。bundleupdate 則會(huì)檢查所有的 gem 更新到最新版本。一般來(lái)說(shuō)你只需要在每次 Gemfile修改后,執(zhí)行bundle install即可。如果有套件關(guān)連性 bundle install無(wú)法解決,它會(huì)提示你執(zhí)行 bundle update

    什么時(shí)候該執(zhí)行 bundle install bundle update? 一般來(lái)說(shuō),總是執(zhí)行 bundle install即可。這個(gè)指令只會(huì)做必要的更新到 Gemfile.lock,執(zhí)行速度較快,它不會(huì)幫你升級(jí)現(xiàn)有的 Gem。而 bundleupdate會(huì)重新產(chǎn)生整個(gè) Gemfile.lock檔案,更新所有 Gem 到最新版本。但是,一次升級(jí)太多套件,可能會(huì)造成除錯(cuò)上的困難。因此會(huì)建議如果要升級(jí),請(qǐng)執(zhí)行 bundle update gem_name一次升級(jí)一個(gè)套件。

    怎么知道可以升級(jí)哪些Gem?

    bundle outdated???

    這個(gè)指令就會(huì)列出有新版本可以升級(jí)的gems

    打包 Gems

    執(zhí)行以下指令,會(huì)將所有用到的 Gems打包進(jìn) vendor/cache目錄。如此執(zhí)行bundle install時(shí)就不會(huì)聯(lián)機(jī)到 http://rubygems.org下載套件。

    bundle package

    什么時(shí)候需要用到這個(gè)功能呢?例如你希望布署的時(shí)候避免外部聯(lián)機(jī),或是你有非公開的 gems不會(huì)上傳到http://rubygems.org網(wǎng)站上。

    如果你有非 Rails script 需要執(zhí)行(也就是放在 Gemfile檔案中的 Gem 所自行提供的執(zhí)行檔),使用 bundle exec可以正確的加載 Bundler的環(huán)境。例如 bundle exec rspec spec/

    名稱慣例

    Rails中有一些命名上的慣例:

    類別命名與自動(dòng)加載

    檔名使用小寫、單數(shù),用底線區(qū)隔。例如當(dāng) Rails看到一個(gè) OrderItem 的類別或模塊(Module),它會(huì)在 autoload_paths (我們?cè)?/span>config/application.rb中有此項(xiàng)設(shè)定) 目錄中自動(dòng)去加載叫做 order_item.rb的檔案,也就是require “order_item”

    如果是有嵌套的類別或模塊,例如Admin::OrderItem,則會(huì)多一層目錄,它會(huì)自動(dòng)加載admin/order_item.rb的檔案,也就是 require“admin/order_item”

    如果你沒有設(shè)定 autoload_paths加入 lib 目錄,或是你的檔案沒有依照慣例命名,那么你會(huì)需要在程序中手動(dòng) require它。基本上,只要依照命名慣例,你不太需要在程序中寫 require

    autoload_paths 目錄是指 Rails 會(huì)自動(dòng)根據(jù)命名慣例加載,而 Ruby$LOAD_PATH 常數(shù)則是 require 時(shí)會(huì)尋找的目錄。像 lib這個(gè)目錄 Rails 默認(rèn)就只有加到 $LOAD_PATH 之中,所以你放在 lib 的檔案是可以 require到,但是因?yàn)槟J(rèn)沒有加到 autoload_paths之中,所以沒有自動(dòng)加載的機(jī)制

    Model 命名

    類別名稱使用大寫、單數(shù),沒有底線。而檔名使用小寫、單數(shù),用底線。數(shù)據(jù)庫(kù)表格名稱用小寫且為復(fù)數(shù)。例如:

  • 數(shù)據(jù)庫(kù)表格 line_items
  • 檔名app/models/line_item.rb
  • 類別名稱 LineItem
  • Controller 命名

    假設(shè)有一個(gè)store controller的話:

  • 檔名app/controllers/store_controller.rb
  • 類別名稱 StoreController
  • 如果需要將controllers檔案做分類,這時(shí)候可以使用Mobules,將檔案放在子目錄下,例如后臺(tái)專用的controllers

  • 檔名app/controllers/admin/store_controller.rb
  • 類別名稱 Admin::StoreController
  • View 命名

    例如一個(gè)叫做 People controller,其中的index action

  • 檔名app/views/people/index.html.erb
  • Helper 名稱 module PeopleHelper
  • 檔名app/helpers/people_helper.rb
  • Rails 組件導(dǎo)覽

    Rails 包含許多個(gè)別的函式庫(kù)組件:

  • Action Pack
  • Action Controller
  • Action Dispatch
  • Action View
  • Action Mailer
  • Active Model
  • Active Record
  • Active Resource
  • Active Support
  • Railties
  • Action Pack

    Action Pack 是個(gè)包含 Action ControllerActionView Action Dispatch gem。也就是“MVC”中的 “VC” 部分。

    Action Controller

    Action Controller Rails應(yīng)用程序中,管理Controllers的組件。Action Controller框架處理傳給 Rails HTTP 請(qǐng)求,萃取出參數(shù),然后分派給所屬的 ActionActionController還提供了 session 管理、樣板演算顯示(template rendering) redirect 功能。

    Action View

    Action View 負(fù)責(zé) Rails應(yīng)用程序中的Views。它默認(rèn)可以產(chǎn)生 HTML XML 輸出。ActionView負(fù)責(zé)樣板的演算顯示(template rendering),包括嵌套(nesting)或局部(partial)樣板,甚至也內(nèi)建支持一些 Ajax

    Action Dispatch

    Action Dispatch 處理 HTTP請(qǐng)求的路由(routing),它把 HTTP請(qǐng)求發(fā)派(dispatch)到它該去的地方,也許是你的應(yīng)用程序或其他 Rack程序。

    Action Mailer

    Action Mailer 是個(gè)建構(gòu) E-mail功能的框架。你可以使用Action Mailer來(lái)接收來(lái)信,或是使用樣板來(lái)寄出純文本或復(fù)雜的multipart信件。

    Active Model

    Active Model Action Pack gem ORMgem (例如 Active Record)之間定義了一組接口。Active Model允許Rails 可以依你的需求把 Active Record換成其他 ORM 框架。

    Active Record

    Active Record Rails應(yīng)用程序中的Models 基礎(chǔ)。它不依存特定的數(shù)據(jù)庫(kù)系統(tǒng),提供了 CRUD功能、先進(jìn)的查詢能力以及可以跟其他 Models關(guān)聯(lián)的本事。

    Active Resource

    Active Resource 提供了與其他業(yè)務(wù)對(duì)象和 RESTful網(wǎng)絡(luò)服務(wù)的鏈接框架。它實(shí)現(xiàn)了一種可以對(duì)應(yīng)以 Web為基礎(chǔ)的Resources 成為本地端支持 CRUD 的對(duì)象。

    ActiveResource 可以很簡(jiǎn)單地實(shí)現(xiàn) SOA 架構(gòu)示范,但是作為實(shí)際用途上則顯得薄弱。筆者會(huì)建議自行實(shí)現(xiàn)客戶端程序,請(qǐng)參考Service-Oriented Design and Implement with Rails3 投影片Rails4也將移除這個(gè)組件

    Active Support

    Active Support Rails里的工具函式庫(kù),它也擴(kuò)充了一些 Ruby標(biāo)準(zhǔn)函式庫(kù)。除了被用在Rails核心程序中,你也可以在你的程序中使用。

    Railties

    Railties Rails的核心程序代碼,用來(lái)把以上各種的框架函式庫(kù)以及 Plugin全部組合在一起。

    總結(jié)

    以上是生活随笔為你收集整理的rails 代码结构详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。