Ruby Rails 不一樣的 Web 應用

2021-08-22 17:45:30 字數 2208 閱讀 8193

我不是web程式設計師,也從來未開發過使用者超過10個人的'web'專案:-),但這並不意味著web技術對我無用,正相反,我開發過許多和web技術有關的程式和庫,web架構和思想對我的設計和開發有著很大的幫助。

例如我經常碰到要設計通訊協議以適應不可靠的傳輸,web的無狀態特性正是克服不可靠傳輸的法寶,屢試不爽:-)

最近一段時間用ruby作了不少東西,也有用rails,但是從來沒有對rails內部進行深究.直到最近碰到乙個專案,促使我不得不到rails裡面去挖掘,以借鑑rails一些優秀的東西。

這個專案非常有趣,是一套用於農場的自動化系統(所以使用者大多是奶牛,哈哈~),包含用於工人們佩戴的移動w裝置,到處安裝的rfid資料收集裝置,閘門控制裝置,電子稱,顯示屏....還有許多名目繁多的裝置,這些裝置的資料有的通過電纜,有的通過zigbee無線網路匯集到一台伺服器上,這台伺服器跑linux,執行rails。伺服器負責收集所有裝置的資料,和傳送指令給相關裝置,例如控制閘門。

給我不斷帶來麻煩的是這個w裝置。

客戶起初對w裝置的操作功能要求不高而對成本敏感,因此w裝置配置了很低的硬體資源,基本上就是靠乙個整合了無線功能的mcu操作,僅數十k的記憶體,但對於簡單的資料收集和傳輸,綽綽有餘。

然而好景不長,隨著專案進行,客戶對w裝置賦予了更多更重要的角色,功能需求暴漲,且快速變化,更重要的是,要求日後能夠定製功能(二次開發)。

那麼伺服器端呢?已經有rails在跑用於收集/展示資料,輸出報表之類的任務,可以利用rails來作為w的服務端麼?

通訊問題,改改webric,從串列埠(連線到zigbee網路控制器)上獲取資料並偽裝成web請求,或許還可以...路由問題,由於zigbee頻寬極其有限,需要高度精簡傳輸內容,因此傳回來的請求串中包含的是非常簡短的內容,需要轉換到對應的controller/action,這個通過新增router對映似乎也可行。mml render問題就比較頭痛了,需要修改的地方不少。

考慮到修改rails可能工作量和分險比較高,於是採用另外乙個方案:設計新的w server,在w server裡面直接利用rails的資源。實際上,最終這個w server直接放在rails應用程式的scripte目錄下(也許vendor目錄更合適),在w server裡面只要加入:

require file.dirname(__file__) + '/../config/boot'

然後就可以使用rails提供的任何資源了,當然對於w server來說,最有用的是models。這樣w server就和rails應用程式渾然一體了。

w server有了rails這樣強大的後盾之後,還需要有:parser, router,server,controller,和mml render.

parser: 負責解析自定義的通訊協議,獲取從w裝置傳來的請求,並解析引數等。

router: 掃瞄並裝載controllers,快取controller物件,根據parser的結果取得相應controller的物件。router還負責監控controller是否已被修改和重新裝載controller.

server: 總控制,從串列埠中讀取資料,呼叫parser解析,把結果傳給router,從router中獲取controler物件並根據parser結果呼叫controller.action,以及快取controller的輸出等等。

controller: 業務邏輯都在這裡實現,呼叫rails的models訪問資料庫。

mml render: 使用erb作為模板檔案,再加上一些輔助的功能,例如render link,menu之類的,和自定義的mml特性密切相關。mml render作為module最終mixin到controller裡面。

可以看出,w server模型幾乎和rails的一樣,在設計w server碰到問題時經常**在rails中是怎麼解決的,因此倒是對rails的了解增進了不少。當然由於w server的工作方式,目標和rails不同,因此複雜度就不可同日而語.

這個專案做完之後,我有幾個感受:

* ruby的開發效率真的很高

除去注釋,full stack的w server的全部**少於千行,what a surprise!當然,這裡沾了rails的光,省卻了models,還有erb拿來就用.然而相比之下,在w上光mml解析和render部分c**就超過2000行.

* 復用rails真的很容易

在這個案例中,就是增加一行**而已.

* web技術,可以無處不在

ruby/rails = make it real!

~文以共勉~

不一樣又不一樣的 木板接水

空地上豎立著n個從左到右排列的木板,它們可以把水擋住,但溢位最邊上木板的水將會流到空地上。已知木板間距都是單位1,現給定每個木板的高度,請求出總共能接住的水量?說明一點,這裡只考慮間距 寬度 和高度,不考慮第三個維度,因此水量是平方單位。木板高度分別是2,1,3,那麼我們可以接住2 2 4平方單位的...

我們不一樣

前輩們因自身實際的種種因素的影響而產生的認知,並不一定適用於我們自身。你可能從來不會去想乙個問題 你的觀點,來自 其實,它們絕大部分來自網路,它們或多或少地蠶食了你的判斷力。未來的路要怎麼走,沒有對與錯。有的,只是每乙個選擇所需要承擔的責任。我不想面臨,後之視今亦猶今之視昔的悲哀。我希望,未來回首,...

我們不一樣

這麼多年的兄弟 有誰比我更了解你 太多太多不容易 磨平了歲月和脾氣 時間轉眼就過去 這身後不散的筵席 只因為我們還在 心留在原地 張開手 需要多大的勇氣 這片天 你我一起撐起 更努力 只為了我們想要的明天 好好的 這份情好好珍惜 我們不一樣 每個人都有不同的境遇 我們在這裡 在這裡等你 我們不一樣 ...