中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
rails3項(xiàng)目解析-2
備注: 文章寫(xiě)的真好,至少?gòu)奈椰F(xiàn)在的水平看,寫(xiě)的太好,在此感謝作者?。?!
rails 3.0是2010年8月份發(fā)布的。迄今為止,3.0已歷經(jīng)多個(gè)tiny版到了3.0.8。3.1已經(jīng)放出rc4,看起來(lái)離正式版已為期不遠(yuǎn)。相對(duì)于2系,3系還是有一些令人驚喜的變化,而且在架構(gòu)上也規(guī)范和嚴(yán)整了許多。3.1中更是又加入了幾個(gè)頗為有趣的特性。我們的項(xiàng)目一直都是緊跟rails新版,很欣慰能夠毫無(wú)道德壓力地做一個(gè)喜新厭舊常換常新的男人。但什么都追新也吃了不少小苦頭,不過(guò)仍然死不悔改,大家都在坐等3.1發(fā)布試吃。
更多關(guān)于rails3的新特性,網(wǎng)上一抓一把,需求和欲望比較強(qiáng)烈的同學(xué)可自行解決,在此不再贅述。下面主要說(shuō)一下我們這個(gè)項(xiàng)目。因?yàn)轫?xiàng)目不大,而且第一期沒(méi)有太多用戶(hù)互動(dòng)的內(nèi)容,所以涉及到的知識(shí)范疇比較小,都是些基礎(chǔ)的東西。
1、目錄結(jié)構(gòu)
除那些默認(rèn)目錄之外,我們?cè)陧?xiàng)目中又另外加了一些自定義的目錄來(lái)做不同的事情。
1.1 errros/。在app/目錄之下,內(nèi)容是各種自定義的XxxError類(lèi)。使用異常機(jī)制能夠使得代碼更加清晰,流程語(yǔ)義更準(zhǔn)確,更好地實(shí)現(xiàn)模塊化的程序結(jié)構(gòu)。
1.2 validators/。在app/目錄之下,內(nèi)容是繼承自ActiveModel::EachValidator的各種驗(yàn)證類(lèi)。使用自定義驗(yàn)證類(lèi)能夠使代碼更加簡(jiǎn)潔,復(fù)用性更強(qiáng)。如:
Ruby代碼 
validates :username, :availability => true, :legality => true, :username => true, ......
這里面就使用了三個(gè)自定義驗(yàn)證類(lèi):可用、合法、符合用戶(hù)名規(guī)則。
1.3 workers/。在app/目錄之下,內(nèi)容是resque任務(wù)的定義類(lèi)。
1.4 其它和項(xiàng)目相關(guān)的目錄。比如在項(xiàng)目根目錄下,我們加了一個(gè)monitor/目錄,里面是resque和redis的監(jiān)控腳本。因?yàn)楸O(jiān)控腳本在概念上屬于項(xiàng)目外層,所以放到根目錄下面,不隸屬于app/。
2、使用組件
2.1 rails 3.0.8。這個(gè)沒(méi)什么可說(shuō)的,用蜂蜜,川貝,桔梗,加上天山雪蓮配制而成,實(shí)在是居家旅行、殺人滅口之必備良藥。不過(guò)我們?cè)?.0.8上吃了點(diǎn)苦頭,丫把safe_buffer設(shè)置為不可改動(dòng),結(jié)果頁(yè)面片段緩存的cache方法中的slice!觸犯了這個(gè)禁條,網(wǎng)站首頁(yè)直接掛掉。還好,發(fā)現(xiàn)這個(gè)問(wèn)題是晚上10點(diǎn),沒(méi)有造成太多損失。3.0.9已經(jīng)修正了這個(gè)大bug,請(qǐng)各位不必多慮。
2.2 mysql2。舍棄了mysql驅(qū)動(dòng),使用mysql2。不過(guò)要設(shè)置為'< 0.3.0',0.3版的mysql2是配合rails 3.1的。
2.3 ruby-oci8、activerecord-oracle_enhanced-adapter。連接公司oracle數(shù)據(jù)庫(kù)取行情數(shù)據(jù)的。還需要安裝oracle的instant client,把安裝目錄添加到/etc/ld.so.conf.d里,然后ldconfig。有想用oracle的可做參考。
2.4 nokogiri、yajl-ruby。正好項(xiàng)目中也要用到nokogiri,所以就干脆替代了rails自帶的xml和json解析器。
2.5 authlogic、cancan。比較了一下authlogic和devise,感覺(jué)各有利弊。因?yàn)閍uthlogic對(duì)于namespace的處理比較靈活,而且也利于第三方身份驗(yàn)證的擴(kuò)展,比較適合我們的需求,所以最后選了authlogic。cancan對(duì)于不是很復(fù)雜的權(quán)限驗(yàn)證,也差不多夠用了。更細(xì)粒度的權(quán)限系統(tǒng),恐怕就得根據(jù)需求自己定制了。
2.6 acts_as_list、acts_as_state_machine、will_paginate。前兩個(gè)不解釋。will_paginate的rails3版本已經(jīng)很久沒(méi)更新了,不知道作者是戀愛(ài)了還是失業(yè)了。kaminari是個(gè)很好的替代,只是有些功能還沒(méi)完善,是否可以完全替換will_paginate有待論證。
2.7 ckeditor、paperclip、rmagick。其實(shí)富文本編輯器已經(jīng)有不少了,比ckeditor好的也不乏其數(shù)。不過(guò)具備相配合的成熟gem的,恐怕目前還只有ckeditor。如果不嫌麻煩,可以找個(gè)更好的編輯器,直接掛上去用,或者自己寫(xiě)gem掛到rails上。
2.8 redis-store、SystemTimer、mongoid。使用redis作為默認(rèn)的rails緩存,SystemTimer是redis client等幾個(gè)gem要求使用的,ruby 1.8.7的timeout不可靠,我見(jiàn)到的幾個(gè)gem的作者都強(qiáng)烈建議使用SystemTimer。mongoid支持rails3,所以就沒(méi)用mongo_mapper。mongoid配置簡(jiǎn)單,語(yǔ)法很不錯(cuò),功能比較強(qiáng)大。
2.9 resque、resque-scheduler、eventmachine。研究過(guò)twitter當(dāng)初做的starling和workling,勉強(qiáng)能用,但配置很復(fù)雜,而且很久不更新了,就始亂終棄之。resque套件另行開(kāi)文,在此不多說(shuō)。
2.10 formtastic。formtastic號(hào)稱(chēng)是語(yǔ)義表單,實(shí)際用起來(lái)還是挺不錯(cuò)的,erb上的代碼簡(jiǎn)潔多了,學(xué)習(xí)曲線也不高,一看即會(huì)。而且formtastic擴(kuò)展性非常好,我們修正了和ckeditor的接口,還自定義了日期選擇(date_picker on jquery)、日期選擇組(date_selects)和驗(yàn)證碼(captcha)控件。
2.11 client_side_validations。這年頭網(wǎng)站上沒(méi)個(gè)客戶(hù)端動(dòng)態(tài)驗(yàn)證,出門(mén)都不好意思跟人家打招呼。它能夠直接使用model中定義的驗(yàn)證規(guī)則,DRY得很。而且能夠和formtastic無(wú)縫整合。另外也很好擴(kuò)展,我們利用回調(diào)加上了動(dòng)態(tài)驗(yàn)證時(shí)的綠對(duì)號(hào)紅叉號(hào)的小圖片。
2.12 capistrano、capistrano-ext。代碼發(fā)布管理的。如果你有不同開(kāi)發(fā)環(huán)境的十幾臺(tái)服務(wù)器需要依次發(fā)布代碼,就知道這東西有什么用處了。同樣,這部分將另行開(kāi)文。
3、配置
雖然說(shuō)“約定優(yōu)于配置”,但也不能沒(méi)配置。不過(guò)如果只要配置配置就能搞定,總比寫(xiě)代碼好多了。
3.1 自定義配置。項(xiàng)目中要使用到一些自定義的配置,比如oracle數(shù)據(jù)庫(kù)的地址、redis服務(wù)器地址等等,而且開(kāi)發(fā)環(huán)境和產(chǎn)品環(huán)境的還不一樣。我們?cè)赾onfig/目錄下放了一個(gè)configuration.yml,里面區(qū)分出不同的environment,各個(gè)env下寫(xiě)入各自的配置。rails初始化的時(shí)候讀取該yml文件,把相應(yīng)env的配置以hash存入全局變量。以后以此全局變量來(lái)取得配置值。
3.2 系統(tǒng)配置。rails3的系統(tǒng)配置大部分都在config/application.rb中。
3.2.1 config.autoload_paths里要加上#{config.root}/lib,3.0版本里不再自動(dòng)加載lib/目錄。
3.2.2 數(shù)據(jù)庫(kù)存儲(chǔ)時(shí)間的字段默認(rèn)使用UTC的時(shí)區(qū),顯示這些字段時(shí)要加time_zone顯式轉(zhuǎn)換。如果你的項(xiàng)目確認(rèn)一輩子都在天朝玩,不想加上啰里啰嗦的顯式轉(zhuǎn)換,可如此設(shè)置:
Ruby代碼 
config.time_zone = 'Beijing'
config.active_record.default_timezone = :local
3.2.3 諸如ckeditor這樣的組件要用到i18n,為了不出問(wèn)題,最好還是顯式指定項(xiàng)目的語(yǔ)言:
Ruby代碼 
config.i18n.default_locale = 'zh-CN'
I18n.default_locale = 'zh-CN'
3.2.4 日志數(shù)據(jù)太多,可設(shè)置自動(dòng)輪換,每周換一個(gè)新的文件:
Ruby代碼 
config.logger = Logger.new(config.paths.log.first, 'weekly')
3.2.5 更換默認(rèn)緩存和解析器:
Ruby代碼 
config.cache_store = :redis_store, 'redis://xx.xx.xx.xx:6379’
ActiveSupport::XmlMini.backend = 'Nokogiri'
ActiveSupport::JSON.backend = 'Yajl'
3.2.6 擴(kuò)展css和js命名:
Ruby代碼 
config.action_view.stylesheet_expansions[:formtastic] = %w(formtastic formtastic_changes)
4、相關(guān)問(wèn)題
4.1 初始化順序。功能模塊和某些配置的代碼,有些在config/application.rb中,有些在config/initializers目錄下的.rb里,有些庫(kù)在lib/下面,這就涉及到一個(gè)rails初始化順序的問(wèn)題。如果代碼執(zhí)行的順序不對(duì),就會(huì)得不到預(yù)期的效果,或者會(huì)出一些莫名其妙的問(wèn)題。rails3啟動(dòng)時(shí)的初始化順序大致如下:
Ruby代碼 
config.ru -> config/environment.rb -> config/application.rb -> config/boot.rb -> rails framework -> bundle gems -> configs in config/application.rb -> alphabetical .rb files in config/initializers
以上順序未做深入研究,不保證完全正確,權(quán)威指南請(qǐng)移步官方文檔。
4.2 sendfile。如果用nginx passenger做rails應(yīng)用服務(wù)器,而且使用send_file或send_data來(lái)發(fā)送比如需要先身份驗(yàn)證等特殊需求的文件,需要在config/environments/下面的配置文件中設(shè)置:
Ruby代碼 
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
否則send_file送出的文件大小為0。
4.3 本地化。需要翻譯輸出本地化文字的時(shí)候,盡量在config/locales/下面的相應(yīng)文件里定義,這樣能夠精簡(jiǎn)erb或model的代碼,職責(zé)也分得很清楚。目前我們?cè)趌ocales下面放了authlogic、formtastic、model中字段中文名和rails系統(tǒng)信息的中文翻譯。
4.4 路由。rails3的routes語(yǔ)法改動(dòng)比較大,而且寫(xiě)起來(lái)很自由。從項(xiàng)目管理的角度來(lái)說(shuō),有必要對(duì)routes的寫(xiě)法做統(tǒng)一的培訓(xùn),使團(tuán)隊(duì)成員都真正理解routes的語(yǔ)法規(guī)則和適用環(huán)境,能統(tǒng)一使用最優(yōu)寫(xiě)法的就盡量使用,實(shí)在不行再用其它寫(xiě)法解決。這樣routes風(fēng)格會(huì)比較統(tǒng)一。而作為反例,現(xiàn)在我們項(xiàng)目里的routes就是大家各顯神通,什么樣的寫(xiě)法都有,很不利于溝通和維護(hù)。
4.5 js框架。rails 3.0的默認(rèn)js框架仍然是prototype,在jquery大行其道的今天,這個(gè)做法有點(diǎn)逆潮流而動(dòng)。作為某些簡(jiǎn)單的js功能,用js generator是省時(shí)省力的做法,代碼也干凈。找了一個(gè)N年前就不更新的rails2的jquery rails,改了改使之適用于rails3,簡(jiǎn)單功能先湊合著用了。還好,3.1終于把默認(rèn)js框架改成jquery了,當(dāng)真是從善如流,幸甚至哉。
4.6 測(cè)試效率。即使在ubuntu平臺(tái)上,跑rspec時(shí)rails所做的前期準(zhǔn)備工作現(xiàn)在也延長(zhǎng)到了好幾秒鐘,作為珍惜生命的開(kāi)發(fā)人員,這幾秒鐘是難以忍受的。我們引入了spork作為測(cè)試的加速器,它會(huì)事先prefork出完整的測(cè)試環(huán)境,節(jié)省了初始化加載的時(shí)間。不過(guò)很不幸,我們現(xiàn)在做的rspec很少,所以在spork方面不做太多發(fā)言。
5、調(diào)優(yōu)
在江湖的傳說(shuō)中,很多哥都會(huì)用“效率低下”來(lái)攻擊rails。不過(guò)作為一個(gè)非計(jì)算密集型的項(xiàng)目,我們很少會(huì)注意到rails在代碼執(zhí)行上有瓶頸。但是在以下幾個(gè)方面,我們還是感覺(jué)到了rails的某些不足,也嘗試著做了一些優(yōu)化。就效果來(lái)看,雖然沒(méi)有數(shù)量級(jí)上的提升,但作為項(xiàng)目來(lái)說(shuō)基本達(dá)到了要求。
5.1 應(yīng)用初始化。rails3引入了rack作為底層架構(gòu),在架構(gòu)層面上比rails2更為復(fù)雜,所以在應(yīng)用的初始化時(shí)耗時(shí)相對(duì)較長(zhǎng)。我們通過(guò)設(shè)置passenger_min_instances,提前多啟動(dòng)幾個(gè)實(shí)例,減少用戶(hù)訪問(wèn)時(shí)啟動(dòng)實(shí)例的時(shí)間。另外使用passenger_pre_start http://www.xxx.com/來(lái)初始化rails應(yīng)用,減少初次訪問(wèn)的響應(yīng)時(shí)間。不過(guò)比較郁悶的是,passenger_pre_start貌似效果并不是很明顯,而且不支持touch restart.txt的重啟,不知道以后會(huì)不會(huì)好一些。
5.2 虛擬機(jī)參數(shù)。即使是ree,ruby虛擬機(jī)的默認(rèn)參數(shù)也基本上不滿(mǎn)足普通應(yīng)用的需求。我們參考了網(wǎng)上有關(guān)twitter和37signal的參數(shù)值,修改配置如下:
Ruby代碼 
RUBY_HEAP_MIN_SLOTS=500000
RUBY_HEAP_SLOTS_INCREMENT=250000
RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
RUBY_GC_MALLOC_LIMIT=50000000
RUBY_HEAP_FREE_MIN=100000
5.3 erb解析。rails3的erb解析效率還是比較低的,聽(tīng)說(shuō)默認(rèn)的erb解析器erubis還是用c寫(xiě)的,不知道是我們的服務(wù)器不夠強(qiáng)勁還是效率本來(lái)就如此。我們網(wǎng)站的首頁(yè)大概有1000行erb,在使用了新的虛擬機(jī)參數(shù)之后,渲染時(shí)間大約在1秒鐘左右。這個(gè)時(shí)間在用戶(hù)體驗(yàn)上屬于不可接受的范圍。
我們把首頁(yè)中渲染耗時(shí)較長(zhǎng)的代碼獨(dú)立成片段文件,每個(gè)文件里面全部使用片段緩存機(jī)制。例如:
Ruby代碼 
<% cache "recommend_#{$recommend_pageid}" do %>
……
<% end %>
其中$recommend_pageid是rails在初始化時(shí)計(jì)算的該片段文件的md5值,這樣如果該片段文件有改動(dòng),緩存中就不存在這個(gè)新的key “recommend_xxxxxx”,rails將重新生成該片段的緩存。這個(gè)方法既可使用片段緩存提高渲染速度,又可實(shí)現(xiàn)片段文件改動(dòng)時(shí)的緩存自動(dòng)更新。
使用片段緩存之后,首頁(yè)渲染時(shí)間降低到了200ms左右,基本滿(mǎn)足了要求。當(dāng)然我們還留了一部分頁(yè)面代碼沒(méi)做緩存。作為一個(gè)懂人情講政治的開(kāi)發(fā)團(tuán)隊(duì),要給自己留出足夠的業(yè)績(jī)提升空間以體現(xiàn)自身價(jià)值,并且給領(lǐng)導(dǎo)留出足夠的命令空間以展現(xiàn)領(lǐng)導(dǎo)權(quán)威。這樣下一次領(lǐng)導(dǎo)再讓你進(jìn)一步縮短首頁(yè)訪問(wèn)時(shí)間時(shí),雙方可皆大歡喜。
6、rails on windows
首先我承認(rèn),windows確實(shí)很不適合rails開(kāi)發(fā),尤其是那個(gè)執(zhí)行效率,生活在mac和ubuntu上的幸福的人兒是永遠(yuǎn)都體會(huì)不到的。不過(guò),如果rails只是我生命中的一小部分,其它大部分事情我確實(shí)需要在windows上做,而且我還很不喜歡虛擬機(jī),那就要研究在windows上開(kāi)發(fā)rails了。本節(jié)內(nèi)容僅是給喜歡windows的同學(xué)提供一點(diǎn)參考,ubuntu和mac控可鄙視加無(wú)視。
其實(shí)解決方案很簡(jiǎn)單,就是使用rubyinstaller,同時(shí)安裝devkit。基于mingw32的這套系統(tǒng)應(yīng)該還算不錯(cuò),到目前為止,一般的需要編譯的gem象mysql2、nokogiri等等都沒(méi)問(wèn)題,最多也就是加幾個(gè)參數(shù),便可編譯安裝。迄今只有SystemTimer因?yàn)槭褂玫搅薼inux的底層SIGALRM而無(wú)法安裝,不過(guò)也可以想個(gè)辦法繞過(guò)去即可,不影響實(shí)際使用。
我的操作系統(tǒng)是windows 7 sp1 ultimate x32,不要用x64,x64下的mysql2安裝會(huì)有一些莫名其妙的問(wèn)題。感覺(jué)x32位還是比x64方便,一般不會(huì)出兼容性問(wèn)題。至于4G內(nèi)存的限制,打個(gè)補(bǔ)丁就行了。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
rails3項(xiàng)目解析之3——redis
跨越邊界: 動(dòng)態(tài)類(lèi)型語(yǔ)言中的 Web 開(kāi)發(fā)策略
Sidekiq in Rails
[GIT] warning: LF will be replaced by CRLF問(wèn)題解決方法
在Windows上安裝Redmine
新手RoR十分鐘初體驗(yàn)Step By Step rails Ruby
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服