rails talk-5
TRANSCRIPT
![Page 1: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/1.jpg)
善⽤用RAILS特性設計系統
![Page 2: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/2.jpg)
RAILS 的好
• 豐富的 helper (form helper, url helper, datetime .. etc)
• 超強的 ORM
• ⽅方便好⽤用的 routing 機制
• 重複使⽤用 partial (SRJ)
• 最 ”前” 到最 ”後” 無縫整合 (form helper => routing => controller => model)
![Page 3: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/3.jpg)
需要注意的 …
• View Render 很慢* fragment cache
• response time / concurrent 能⼒力 * unicorn* puma
• 有些只適⽤用於專案還沒那麼複雜的時候* nested model* 複雜的 callbacks / validations ( 拆出 layer )
![Page 4: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/4.jpg)
常⽤用的 GEM
• simple_enum (讓 active record ⽀支援列舉,⽐比 rails 內建好⽤用)
• active_link_to (處理 link active 狀態的 helper)
• jquery-rails [ujs] (整合前端 + rails routing 機制)
• bh (bootstrap helpers)
• bootstrap-sass (sass 版本 bootstrap,可複寫變數)
• bootstrap_form ( bh 格式的 form helper,整合 activerecord)
• stamp + stamp-i18n ( 簡單的時間格式 helper )
• soft_deletion ( 軟刪除⼯工具 )
![Page 5: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/5.jpg)
SIMPLE ENUM #1
![Page 6: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/6.jpg)
SIMPLE ENUM #2
![Page 7: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/7.jpg)
ACTIVE LINK TO #1
![Page 8: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/8.jpg)
ACTIVE LINK TO #2
![Page 9: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/9.jpg)
ACTIVE LINK TO #3
* ⼀一般選單
* 搭配 simple_enum 做 status tab
![Page 10: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/10.jpg)
JQUERY-RAILS #1 -
* scaffold 會看到的 code ( 學到 method & confirm)
* remote options (改⽤用 ajax 送出) * 會⾃自動判斷 json or javascript
![Page 11: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/11.jpg)
JQUERY-RAILS #2 - ⼀一鍵更新
/admin/orders/index.html.haml
Admin::OrderController
simple_enum 變更資料狀態 + 共⽤用 update action 邏輯
![Page 12: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/12.jpg)
SRJ #1 範例
* (Server-generated JavaScript Responses)
* PostsController
* posts/index.html.haml
* posts/destroy.js.erb
![Page 13: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/13.jpg)
SRJ #2 FORM 也可以
* PostsController
* posts/create.js.erb
* pages/_form.html.haml
![Page 14: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/14.jpg)
SRJ #3 - $.GET / $.POST 也可以
* PostsController
* posts/index.js.erb
* posts/index.html.haml
![Page 15: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/15.jpg)
JQUERY-UJS - AJAX EVENT https://github.com/rails/jquery-ujs/wiki/ajax
![Page 16: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/16.jpg)
SRJ #4 - BOOTSTRAP 應⽤用
• Modalnew.js / edit.js 在 modal 裡⾯面 render form create.js / update.js 成功就關閉 modal,失敗就 re-render & replace html
• Loading Button 綁 ajax 事件ajax:beforeSend - $(this).button(‘loading’); ajax:success - $(this).button(‘reset’); ajax:error - $(‘#error-modal’).modal();
• Form + Loading Button 避免重複送出ajax:beforeSend - 找到該 form 的 submit button 設定為 loadingajax:success - 找到該 form 的 submit button 還原ajax:error - $(‘#error-modal’).modal();
![Page 17: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/17.jpg)
SRJ #5 - 搭配 PUSHER • https://pusher.com/
• 是⼀一個專⾨門處理 realtime communication 的雲端服務
• 1. front-end 提供 web socket endpoint
• 2. back-end 提供 API 作通知
• 當收到 event ⽤用 SRJ 做資料更新
![Page 18: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/18.jpg)
⽤用這樣的開發⽅方式⾮非常快
但是 render view 的成本很⾼高
![Page 19: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/19.jpg)
Fragment cache
![Page 20: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/20.jpg)
⼀一次 cache 全部
![Page 21: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/21.jpg)
cache key 有⻑⾧長度限制
太多 record 分批 cache
![Page 22: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/22.jpg)
好⽤用的東⻄西效能通常不好,也要 cache ⼀一下
![Page 23: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/23.jpg)
我的設計原則
![Page 24: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/24.jpg)
V1 開發效率第⼀一
• 軟體效能⽤用 cache 先擋,撐幾個版本在⼤大改版
• 管理者後台以 “可以⽤用就好” 的標準
• 不⾃自⼰己發明 UI,把 bootstrap⽤用到淋漓盡致
![Page 25: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/25.jpg)
⽤用 SRJ 提升開發效率
• ⼩小技巧避免做更多⾴頁⾯面、功能 e.g. nested form (has_many association)
• 避免 redirect 不必要的 render view 成本CP值⾼高,不⽤用花太多時間,多拖幾個版本遇到效能問題,等公司賺錢再請⼤大神來改版
![Page 26: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/26.jpg)
常⽤用的 UI COMPONENT
• navbar (網站選單)
• navs (橫的、直的)
• form (inline, 橫的, 直的)
• panel
![Page 27: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/27.jpg)
後台設計 PATTERN #INDEX
• 表格 - 呈現資料
• filter - 過濾資料
• 分⾴頁
• 新增按鈕
![Page 28: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/28.jpg)
後台設計 PATTERN #INDEX
• 表格 - 呈現資料
• 顯⽰示夠多資料,就不⽤用做 #show action
• 區分固定寬度、不固定寬度
• filter - 過濾資料
• 分⾴頁
• 新增按鈕
![Page 29: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/29.jpg)
後台設計 PATTERN #INDEX
• 表格 - 呈現資料
• filter - 過濾資料
• 關鍵字搜尋
• 分類 (看情況要做)
• 區間搜尋 (只有資料超級多才會做 e.g. 訂單管理)
• 分⾴頁
• 新增按鈕
![Page 30: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/30.jpg)
後台設計 PATTERN #INDEX 範例 1
![Page 31: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/31.jpg)
後台設計 PATTERN #INDEX 範例 2
![Page 32: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/32.jpg)
後台設計 PATTERN #INDEX 範例 3
![Page 33: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/33.jpg)
後台設計 PATTERN #INDEX 範例 3
![Page 34: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/34.jpg)
其他好⽤用的東⻄西
• activerecord - nested form (拆 form layer 前的⼟土砲解法)
• activerecord - serialize / store 不確定結構、和資料未來如何應⽤用?
• activerecord - callbacks (拆 operation layer 前的⼟土砲解法)
![Page 35: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/35.jpg)
結論
• 新事業摸索過程沒有固定模式,哪來的 clean code?
• startup 寧可閒閒沒事,也不要把時間花在技術上(除⾮非是提供技術的公司)
• 花 5 倍時間開發可能只換來 “節省⼀一半” 效能划算嗎換個⾓角度「多花⼀一倍伺服器租任預算可以省五倍時間划算嗎?」
![Page 36: Rails talk-5](https://reader038.vdocument.in/reader038/viewer/2022103019/55c29698bb61eb54128b46fe/html5/thumbnails/36.jpg)
成果
• 需求:
• 能製作 landing page ⾴頁⾯面
• 可客製化 domain
• 對 mobile device 做優化
• 可新增產品 / 促銷
• 使⽤用者能在看完 landing page 直接訂購
• 後台可管理 landing page 的訂單
• 訂單畫⾯面必須即時同步 (多⼈人編輯時免重整同步)
• 可匯出貨運單
• ⼯工時:15天 * 4 ⼩小時 = 60⼩小時