Rails 從入門(mén)到完全放棄
轉(zhuǎn)載地址: Rails 從入門(mén)到完全放棄
前言
這是一篇關(guān)于Rails的開(kāi)發(fā)經(jīng)歷的文章,旨在將Rails中遇到的各種問(wèn)題分享給還未接觸Rails或是已經(jīng)上路的朋友趾痘。雖說(shuō)做Rails的開(kāi)發(fā)時(shí)間不長(zhǎng),剛好一年多贝室。但是哮幢,在這一年的時(shí)間中贬丛,該使用的技術(shù)架構(gòu),Ruby-China
推薦的Gem包鹃共,都嘗試過(guò)使用過(guò)了鬼佣,也為業(yè)務(wù)開(kāi)發(fā)了一些Gem包。談不上精通Rails及汉,如果把Rails作者定為最高等級(jí)沮趣,他是F1賽車(chē)手屯烦,我該是個(gè)跑出租的老司機(jī)。
背景
早前有做過(guò)Java,PHP掺出,.Net的開(kāi)發(fā)毅桃,相信玩Rails的朋友多多少少也都有寫(xiě)過(guò),不過(guò)主要還是以前端為主翁狐。早在IE7/IE8 時(shí)代做前端開(kāi)發(fā)类溢,那時(shí)NodeJS
還沒(méi)火起來(lái),前端成了低技術(shù)含量又耗體力又沒(méi)地位的活露懒。不過(guò)闯冷,還好有NodeJS
,讓我趕上了這個(gè)時(shí)代懈词。
怎么接觸到Rails
當(dāng)公司的一個(gè)PHP的多人即時(shí)聊天項(xiàng)目接近尾聲時(shí)蛇耀,我們?cè)谒伎寄懿荒軐⒊绦騿T生產(chǎn)力解放出來(lái)?是不是可以嘗試一些其他的技術(shù)架構(gòu)坎弯。很快纺涤,經(jīng)過(guò)多方研究,發(fā)現(xiàn)Rails是單兵作戰(zhàn)的神器抠忘。相比PHP撩炊,可以達(dá)到Rails : PHP = 1 : 4 的效率。但對(duì)于一個(gè)技術(shù)架構(gòu)成熟的技術(shù)團(tuán)隊(duì)來(lái)說(shuō)崎脉,放棄原有的技術(shù)架構(gòu)去使用一個(gè)從未接觸過(guò)新技術(shù)拧咳,時(shí)間成本和決心是很重要的。但挑戰(zhàn)往往會(huì)帶來(lái)意想不到的收獲囚灼。
在深大圖書(shū)館的 Rails之道
學(xué)習(xí)新技術(shù)的第一件事就是去找學(xué)習(xí)資料骆膝。在google上找了很久,發(fā)現(xiàn)深大圖書(shū)館有各種各樣的技術(shù)書(shū)籍啦撮,果不其然谭网,在這里找到了Ruby元編程
,Rails之道
赃春,敏捷開(kāi)發(fā)之道
這些書(shū)籍愉择,但是版本比較老。為了能夠掌握最新版本的知識(shí),下載了相應(yīng)的英文版PDF锥涕,一起結(jié)合衷戈。修煉Rails的過(guò)程是痛并快樂(lè)著的,因?yàn)橐D(zhuǎn)變思維模式层坠,去接受新的思想殖妇,去了解諸多的語(yǔ)法糖因何而生。學(xué)累了就躺會(huì)破花,餓了就上個(gè)外賣(mài)谦趣,腦袋成漿糊了就洗把臉。其實(shí)接觸一門(mén)新語(yǔ)言并不是多難座每,這是一個(gè)循序漸進(jìn)的過(guò)程前鹅。好在前端底子厚,學(xué)習(xí)ERB
峭梳,UJS
舰绘,RJS
的過(guò)程比較輕松,但是Turbolinks
對(duì)于前端工程師來(lái)說(shuō)就是噩夢(mèng)葱椭,一直到現(xiàn)在我都用的Pjax捂寿。不喜歡Turbolinks
的做法,Pjax
顯得很機(jī)智孵运。關(guān)于Turbolinks
和Pjax
我并不是挑起戰(zhàn)爭(zhēng)秦陋,仁者見(jiàn)仁,智者見(jiàn)智掐松。
用Rails對(duì)電商的探索
在構(gòu)建電商系統(tǒng)的時(shí)候踱侣,很自然就 pull 了ECShop
的源碼來(lái)學(xué)習(xí)。
業(yè)務(wù)上的問(wèn)題并不大大磺,有現(xiàn)成案例抡句,結(jié)合需求來(lái)訂制開(kāi)發(fā)很快。
同時(shí)在開(kāi)發(fā)過(guò)程中Ruby-China
社區(qū)也提供了許多幫助杠愧。類(lèi)似查詢 N + 1
問(wèn)題待榔,CanCanCan
權(quán)限問(wèn)題.....
文件上傳
上傳圖片
對(duì)于圖片等資源的處理,最開(kāi)始沒(méi)有選用Carrierwave
的方案流济,而是使用七牛云存儲(chǔ)JS SDK
锐锣,開(kāi)始接觸的時(shí)候,發(fā)現(xiàn)并沒(méi)有多少參考文檔绳瘟,于是想是不是這個(gè)東西比較簡(jiǎn)單也比較少人用雕憔,還是Ruby-China
社區(qū)的朋友太懶。后面深入研究后發(fā)現(xiàn)糖声,這類(lèi)云存儲(chǔ)的方法還是用得比較多斤彼,也比較便捷分瘦,但對(duì)于新手還是有一定門(mén)檻,所以做完之后順帶寫(xiě)了相應(yīng)的教程造福社會(huì)琉苇。
富文本編輯器上傳圖片
在富文本編輯器中Froala可以說(shuō)是佼佼者嘲玫,我們選用了Froala。但是遇到一個(gè)問(wèn)題并扇,F(xiàn)roala中的圖片上傳僅支持Amazon云
去团,因此不得不改造Froala
的源碼。幸運(yùn)的是這個(gè)過(guò)程并不困難穷蛹,我將改造后的Froala用策略模式做成了一個(gè)Gem: wysiwyg-rails-qiniu土陪,又一次造福社會(huì)。
猴子補(bǔ)丁
在使用will_paginate
的時(shí)候俩莽,分頁(yè)的結(jié)構(gòu)與樣式與Materia UI
的風(fēng)格并不相符旺坠,并且沒(méi)有找到合適的Gem乔遮,所以大膽的用起了打開(kāi)類(lèi)
的法術(shù)扮超,并且紀(jì)錄了這一過(guò)程《 為什么重寫(xiě)will_paginate 》
Pjax
使用Pjax的過(guò)程相對(duì)比較順利,在聽(tīng)完Rei
大神對(duì)Turbolinks
的講解之后蹋肮,還是堅(jiān)定不移的使用Pjax
出刷,值得注意的是在使用WiceGrid
的時(shí)候,會(huì)存在初始化組件問(wèn)題坯辩,當(dāng)時(shí)是使用data-skip-pjax
解決馁龟。不過(guò)現(xiàn)在前后端分離,前端使用React + Redux操作DOM比以往輕松多了漆魔。事實(shí)上WiceGrid
的篩選方式對(duì)于用戶并不友好坷檩。
Devise 和 OmniAuth
這兩個(gè)Gem的使用不多,在嘗試過(guò)Devise
之后改抡,還是得自己手寫(xiě)一遍登錄等功能矢炼,第三方登錄開(kāi)始有考慮用,后面發(fā)現(xiàn)還用不上就沒(méi)有研究了阿纤。
china_city
在使用china_city的時(shí)候發(fā)現(xiàn)一個(gè)小問(wèn)題句灌。
(($) ->
$.fn.china_city = () ->
@each ->
// 下面這一行選擇.city-select的時(shí)候沒(méi)有限制為select
// 如果class有沖突會(huì)出現(xiàn)bug.
// 所以更正為 $(@).find('select.city-select')
selects = $(@).find('.city-select')
selects.change ->
.
.
.
)(jQuery)
前端css框架
在開(kāi)發(fā)中多次切換了前端技術(shù)棧。只想告訴大家欠拾,Materia UI
并不適合后臺(tái)使用胰锌,而且與諸多的Gem包存在兼容問(wèn)題,Rails中大部分跟前端有關(guān)的Gem都是基于Bootstrap
藐窄。所以覺(jué)得Bootstrap
審美疲勞的朋友资昧,還是繼續(xù)用著吧。
前端JS處理
隨著JS的增多荆忍,維護(hù)起來(lái)會(huì)越來(lái)越難格带,在Rails的項(xiàng)目中并沒(méi)有做JS模塊化诺凡,而是將JS用工廠模式匯集到了一起,新的功能代碼會(huì)放到工廠車(chē)間去践惑,在使用的時(shí)候 new 一個(gè)工廠腹泌,調(diào)用需要的功能即可,同時(shí)保證了可復(fù)用性尔觉。
部署
其實(shí)Rails的應(yīng)用部署相對(duì)比較容易凉袱,沒(méi)有太多的內(nèi)容。只要注意配置文件加后綴防止被新的commit
覆蓋就好了侦铜,一般來(lái)說(shuō)专甩,寫(xiě)好shell腳本實(shí)現(xiàn)一鍵部署也并非難事。
微信支付
現(xiàn)今主流的是微信支付和支付寶支付钉稍,銀聯(lián)的太蛋疼了涤躲。相比與微信支付,支付寶的文檔真心不友好贡未,看到吐种樱,而且申請(qǐng)流程繁瑣。如果你有打算在項(xiàng)目中使用支付寶支付俊卤,最好提前兩個(gè)月做申請(qǐng)嫩挤。雖然我不太喜歡馬化騰,但是微信支付的文檔我給32個(gè)贊消恍,使用起來(lái)也方便岂昭。微信支付的申請(qǐng)流程更加透明一些,每個(gè)節(jié)點(diǎn)都很快狠怨。使用下面的Gem
gem 'wechat'
gem 'wx_pay'
但是也有一個(gè)問(wèn)題待解決约啊,就是在支付時(shí)取消訂單,數(shù)據(jù)庫(kù)狀態(tài)更新佣赖,而微信支付的數(shù)據(jù)狀態(tài)未更新恰矩,再進(jìn)行支付的時(shí)候就會(huì)出現(xiàn)訂單號(hào)已存在的error
。
微信支付虛擬鍵盤(pán)
在便利店用過(guò)微信支付的朋友應(yīng)該知道茵汰, 好近
這樣的第三方支付商的虛擬鍵盤(pán)枢里。開(kāi)始做虛擬鍵盤(pán)的時(shí)候想扒一下好近
的源碼,奈何用微信開(kāi)發(fā)調(diào)試工具根本拿不到蹂午。所以只能自己寫(xiě)栏豺,遇到的第一個(gè)問(wèn)題就是點(diǎn)擊事件延遲300ms,雖說(shuō)可用Tap
事件豆胸,被搞得不要不要的奥洼。先后嘗試了JqueryMobile.Tap
,FastClick
等解決方法晚胡,仍然是在Android
上延遲超高灵奖,IOS
流暢嚼沿。后面靈感閃現(xiàn),我為什么要給用戶一個(gè)完整的點(diǎn)擊事件呢瓷患?一碰到就觸發(fā)鍵盤(pán)不是可以讓用戶得到的反饋跟好么骡尽。索性偷懶了一把。
$(element).on('touchstart', function(e){/* do something */}
Rails 的問(wèn)題
Rails從誕生到現(xiàn)在擅编,已有經(jīng)年攀细。開(kāi)發(fā)過(guò)程中最拖慢開(kāi)發(fā)進(jìn)度的不是需求變動(dòng),也不是技術(shù)點(diǎn)爱态,使用了assets pipeline
的話谭贪,在調(diào)試頁(yè)面的時(shí)候資源加載總是很慢。實(shí)在受不了的時(shí)候嘗試了結(jié)合NodeJS
锦担,用Gulp
browser sync
俭识,來(lái)代理資源,雖說(shuō)速度快超多洞渔,但不是官方集成的方案套媚,多多少少讓強(qiáng)迫癥的人很難受。對(duì)于業(yè)務(wù)復(fù)雜的電商系統(tǒng)來(lái)說(shuō)痘煤,Rails標(biāo)準(zhǔn)的Action
肯定不夠用凑阶,而自定義的寫(xiě)出來(lái)感覺(jué)不倫不類(lèi),可能是功夫不到家衷快,但是沒(méi)有找到更好的編程參考。其他的就是性能問(wèn)題了姨俩,了解Elixir
的朋友應(yīng)該就知道了蘸拔。
跟著Peter學(xué)Meteor
響應(yīng)Peter
的號(hào)召,我也全情的投入到了Meteor
+ React
+ Redux
的大軍中去了环葵。雖說(shuō)沒(méi)用Meteor
做過(guò)大型項(xiàng)目调窍,但是小應(yīng)用做起來(lái)是得新應(yīng)手了。好像也沒(méi)有看到有多少大型項(xiàng)目用Meteor
+ React
+ Redux
技術(shù)棧的张遭。用上React
前端代碼思路和結(jié)構(gòu)變得清晰多了邓萨。也可以使用諸多的React
組件了。類(lèi)似于Amazeui菊卷,Ant Design缔恳,這些優(yōu)秀的設(shè)計(jì),連UI的費(fèi)用都省了洁闰。
我與Elixir 和 Phoenix 不能說(shuō)的秘密
Elixir
不用我說(shuō)歉甚,相信大家都有耳聞了,函數(shù)式編程是未來(lái)扑眉。一個(gè)專(zhuān)業(yè)前端的Rails工程師切換到Elixir
的過(guò)程沒(méi)有第一次經(jīng)歷的痛苦纸泄,當(dāng)你接受了函數(shù)式的思想之后相當(dāng)順暢赖钞。社區(qū)里面有的人說(shuō)Phoenix
抄Rails
的,我并不認(rèn)同聘裁,Phoenix
傳承了敏捷開(kāi)發(fā)的思想雪营,也為開(kāi)發(fā)者提供了諸多的便利,像Hot load
的技術(shù)也被集成進(jìn)來(lái)衡便,對(duì)于Socket
的支持也是相當(dāng)?shù)暮米跨帧H诤?code>Elixir的特性,讓多線程成為利器砰诵,利好多多征唬,如果可以,你應(yīng)該像我一樣去深入研究下Phoenix
茁彭,還有你們常用的Devise
也是Phoenix
的作者寫(xiě)的总寒。當(dāng)Rails
老了,你還有Phoenix
結(jié)束語(yǔ)
AD:你錯(cuò)過(guò)了房地產(chǎn)理肺,錯(cuò)過(guò)了網(wǎng)購(gòu)摄闸,錯(cuò)過(guò)了炒股,別再錯(cuò)過(guò)Elixir
Phoenix
React
Redux
妹萨。
作者:本猿不才年枕,文采平平,且讀切珍惜乎完。