天天看點

rails一些雜亂的東西 打開網頁包括的異常 array.map的塊操作 Rails程式初始化

begin
  doc = Nokogiri::HTML(open(curl))
rescue OpenURI::HTTPError
  logger.error("not found while validating the claimed file")
  false
rescue Errno::ETIMEDOUT
  logger.error("timed out while validating the claimed file")
  false
rescue Errno::ENETUNREACH
  logger.error("network problem while validating the claimed file")
  false
rescue Exception => details
  logger.error("#{details} while validating the claimed file")
  false
end
           

Array.map 用法

今天在看beast源代碼,在看到topics_controller # show的時候發現了一行讀不懂的代碼:

@voices = @posts.map(&:user) ;

然後看了看doc,發現doc上并沒有關于這種用法的解釋,于是google,也沒有找到合适的答案,無奈,隻能自己嘗試。通過puts @voices 我發現@voices是一個user 對象的集合,而post belongs_to user, 到這裡我并沒有找到任何的關聯;這時我又試着将&:user替換為&:user_id,這時候再puts @voices,列印出來的是數字,。。。嗯似乎有點明白了;再将&:user_id替換成&:body,put出來的是string array body的值。這下終于明白了,原來 @posts.map(&:user)[email protected]{|post| post.user}

Rails程式初始化的過程

《 Rails 進階程式設計》前言介紹說這不是為初學者準備的,讀者應該對 web 構架有所了解,很好的掌握 ruby1.8 ,有使用 ruby on rails 的網站開發經驗。還推薦了一些讀者本書之前應該讀的一些圖書。作者推薦的下面幾本書都是很不錯的,不過有些還沒看。

1 、《 Programming Ruby 》,第 2 版,之前看類和子產品的部分。

2 、《 The Ruby Programming Language 》 , 該書對 ruby1.8 和 ruby1.9 都做了詳細的介紹,目前正在讀,十分不錯的一本書。

3 、《 Best of Ruby Quiz 》,該說選擇了 25 道難題,然後給出了解決方案。

4 、《 Agile Web Development with Rails 》,現在第三版的中文版也有了。幾乎是 rails 的入門必讀書籍。

5 、《 Rails Cookbook 》,在圖書館看到了,一時看不完。等下下個月在看下。

這些都是一些學習 ruby 和 rails 的參考書籍,十分優秀的著作。自己以前都是用東西,上網查,很不系統,讀書的樂趣就在于能夠告訴你理論,從理論的角度出發去解決問題,是一種“授人以漁”。

書歸正傳,本書開始講解的是 ruby 的一些基本知識。看了下,就當是複習了,不過收獲還是挺大的,溫故而知新。

從學習 rails 開始,總是學習 ruby api , rails api 之類的,不太了解 rails 的運作的各個步驟,不能高屋建瓴的統籌下, api 在熟練總覺得缺點什麼,不能達到收放自如的地步。是以,我一直想找一些 rails 應用程式初始化和運作過程的資料,系統的了解和認識下,并試着自己去親手配置,學習下。

先看下 initializer.rb 檔案, Rails::Initializer 是用 ruby 處理 Rails 環境設定初始化的主類。應用的初始化是從 config/environment.rb 開始的,它包含了這樣的 block:

Rails::Initializer.run do |config|

#

end

Rails::Initializer.run 生成一個新 Rails::Configuration 對象到 block 中。接着 run 方法建立一個新的 Rails::Intializer 對象,并調用 process 方法,該方法執行下面的步驟來初始化 Rails :

1. check_ruby_version: 確定使用的是 1.8 以上

2. set_load_path: 将架構路徑加載到 ruby 加載路徑中,如果說存在的話即存在, vendor/rails 或者 RAILS_FRAMEWORK_ROOT ,如果使用的是 ubuntu 作業系統的話,并且采用 apt-get 安裝的 ruby 和 rails 系統會在每個的 rails 應用程式的 vendor 目錄下會有一個 rails 的檔案。

3. require_framework: 加載在 frameworks 配置選項中列出的每個架構,如果沒有則認為是 RubyGems 安裝的。

4. set_autoload_paths: 根據配置變量 load_paths 和 load_once_paths 設定自動加載路徑。參數與第二步一緻,用于處理未知變量和方法的時候。

5. load_enviroment: 加載并執行環境相關( development,product,test )配置檔案

6. initialize_encoding: 設定 $KCODE 為 u 來使得整個 Rails 支援 UTF-8

7. initialize_database: 如果使用了 ActiveRecord ,設定它的資料庫配置,并連接配接到相應的資料庫伺服器。

8. initialize_logger: 設定成 logger ,将頂級的 RAILS_DEFAULT_LOGGER 設定到該執行個體,如果在配置中指定 logger 就使用它,如果沒有,就會建立一個新的 logger 并定向到 log_path 指定的那個,如果失敗了,會顯示一個警告,并把 log 重定向到标準錯誤輸出。

9. initialize_framework_logging: 把 ActiveRecord , ActionController , ActionMailer 設定成剛剛初始化的 logger 。

10. initialize_framework_views: 把 ActionController 和 Action Mailer 設定 view_path 值,代表了視圖路徑。

11. initialize_dependency_machamism: 基于 cache_classes 配置項的值,來設定 Dependencies.mechaism( 他決定了是用 require 還是 load 來加載檔案 ) ,那好來看下 require 和 load 的差別吧: require,load 用于檔案,如 .rb 等等結尾的檔案, require 一般情況下用于加載庫檔案,而 load 則用于加載配置檔案, require 加 載一次, load 可加載多次。

12. initialize_whiny_nils: 如果 Whiny_nils 配置項設定為 true ,就會給 NilClass 添加 Whiny Nil 擴充(對 nil 上調用 id 或其他方法時他會抱怨)

13. initialize_temporay_directories: 設定 ActionController 的臨時 session 和 cache 目錄,如果他們存在檔案系統中。

14. initialize_framework_settings: 将架構特定的配置項轉換到架構 Base 類的方法調用上。例如,考慮這樣的配置選項 :

config.active_record.schema_format =:sql , config.active_record 對象是一個 Rails::OrderedOptions 的執行個體,他從根本上是個有序 hash (目的是讓配置保持順序)。在初始化期間, initialize_framework_settings 方法将他轉化成為下面的形式:

ActiveRecord::Base.sechema_format = :sql

15. add_support_load_paths: 給支援的功能添加加載路徑。

16. load_plugins: 從 plugins 配置項指定的路徑加載插件(預設從 vendor/plugins )。如果指定了一個 plugins 的配置項,就按它指定的順序加載插件,加載 plugin 是在接近整個程序的尾聲時進行的,是以他們可以覆寫已加載的插件。

17. load_observers: 執行個體化 ActiveRecord 的 Observers 。他是加載完 plugin 之後要做的,是以 plugin 有機會修改這些 observer 類。

18. initialize_routing: 加載處理 routes ,并根據 controller_paths 配置項設定 Controller 路徑

19. after_initialize: 調用是以使用者自定義的 after_initialize 回調,這些回調是在 config.after_initialize{…}block 裡定義的。

20. load_application_initializers: 加載所有的 RAILS_ROOT/config/initializers 及其子目錄的 ruby 檔案。

至此為止, rails 已經準備好請求了。