hothero's TechNote

Will be sharing troubleshooting experiences, findings, tutorials, ...

rails

Rails4 Patterns III: Concerns

Concerns 是 Rails 拿來做模組化的一個方式,在 Rails4 之後也正式在 app/models/ 內有了 concerns 這麼一個資料夾的一席之地,也是一種 Rails Convention。 把重複的 Model 程式碼搬到 Model Concerns 內## 留言功能在臉書不斷的演進下,似乎已經成為現在網站的一個基本盤功能,什麼內容都可以討論一下。Rails4 Patterns 裡面拿這個當做範例,覺得蠻適合的。 # app/models/post.rb class Post < ActiveRecord::Base has_many :comments, as: :commentable def comments_

  • hothero
    hothero
rails

Raiils4 Patterns II: Class Methods and Scopes

Extracting Queries # app/controllers/posts_controller.rb class PostsController < ApplicationController def index @posts = Post.where('published = ? AND published_on > ?', true, 2.days.ago) end end 這是 controllers 內會常見的程式碼,以結果來說完全沒問題,但考量到維護性與可讀性,有可以改進的地方: 在 controllers 內做了太多細節 容易產生不必要重複的程式碼 測試較難撰寫 改進後 # app/controllers/posts_controller.

  • hothero
    hothero
rails

Rails4 Patterns I: Models

今天起春節希望每天介紹 Rails4 Patterns 內的一個章節給大家,這是一個在 Code School 的課程,原址:https://www.codeschool.com/courses/rails-4-patterns 肥肥的 Controller 是不好的 原因有幾個: 會難以理解 商業邏輯難以統整 程式碼間容易衝突 難以開發新功能 像是以下程式碼 class ItemsController < ApplicationController def publish if @item.is_approved? @item.published_on = Time.now if @item.save flash[:notice]

  • hothero
    hothero
rails

Awesome Rails Gem

awesome-rails-gem 前陣子整理的 gem 上了 rubyweekly,也算是生活中的小確幸吧!當時只是單純的想法,簡單整理了一下去年一路走來,在開發 rails 專案上學到的這些 gem,也沒想過會變成這樣 XDD 過去因緣際會碰過不少程式語言,但這些過往,確也成為去年開始重新接觸 Ruby on Rails 這個框架的意識阻礙,嘗試用過去一些功能撰寫上的 tricky 想法理解這個框架背後的設計。直到一再又一再的發現很多 gem(前人做過 best practice 的可再利用套件),一再又一再的改架構,覺得怎麼寫更好的過程,有種驚醒將過去意識拋下重新體會 Rails 的藝術。 或許這些 gem 整理沒辦法表象 Rails 的設計巧思(大概得從 rebuilding rails 這本電子書中才能深刻體會)

  • hothero
    hothero
gem

Rails Gem & Assets Management Tools/Services

專案不斷的成長,需要更多的是模組化的開發與管理,在 Rails 中的模組是 gem,但一般我們常用 gem source 是 rubygems,不過這是 public 給大家都可以使用的,私密的、公司機密的該怎辦? Gemfury Gemfury 是一個供 public 與 private gem 存放與串接的服務,可以如一般我們在使用 rubygems 這個 source 一樣,只差在網址的部份,並且也完整支援 gem 的 deployment。 使用方法很簡單,只要申請完把 gem 丟上去就可以,如範例的 Gemfile(主要修改 source): 若想要自己建一個 Gemfury,

  • hothero
    hothero
rails

Rails' rescue_from 例外處理

正常在實作 Rails 的 show action 時都會是: @post = Post.find(params[:id]) 根據傳入的 id 用 find 去找到物件,但若沒有這個 id 的紀錄呢?就會跑出 ActiveRecord::RecordNotFound 的錯誤,是錯誤喔不是 warning 而已 但其實這事情也不是挺嚴重,可能就不小心打錯 ID 或是被爬蟲亂爬導致,不算是 bug,只是沒有特別處理(尤當裝 rollbar 後,一直累計噴錯也不是辦法...) 那 rescue_from 是 ActiveController 裡面非常有用的一個函式,可以在一個

  • hothero
    hothero
rails

rails turbolinks 實務小記

承接上篇文章,若對於 rails turoblinks 還不知道是什麼,可以參考此文:Rails Turbolinks & PJAX。這篇條列幾點在實作 rails turbolinks 時要注意的事項: 只有 <body> 的內容會被更動 Rails Turbolinks 目前版本只有 <body> 與 <title> 的內容會被更動,為什麼說「目前這個版本」?因為今年底前 turbolinks 第 3 版應就會隨著 rails 5 一起被 release,屆時將會有非常非常大的變動...可參考 turbolinks

  • hothero
    hothero
ruby

ruby 撰寫上該注意的效能細節

ruby 提供非常多的函式,但同一種需求有不同寫法,往往我們都沒注意到效能細節,只知道要把功能寫出來。最近 github 上便有人針對類似功能的函式作些效能比較,在此針對特別或是速度差很多的地方作些個人筆記。原出處:https://github.com/JuanitoFatas/fast-ruby。 註:函式名稱會有標記哪種寫法較快,是 ruby 2.2.0 版本 多個變數的 assignment def fast _a, _b, _c, _d, _e, _f, _g, _h = 1, 2, 3, 4, 5, 6, 7, 8 nil

  • hothero
    hothero
rails

rails cookie/session cross all subdomains

rails 目前整個 cookie/session 機制搭載的是 activerecord-session_store 這套 gem,設定檔是在 config/initializers/session_store.rb 內。 以目前開發中的專案設定為例: Rails.application.config.session_store :cookie_store, key: Rails.application.secrets.secret_key_base 對於 cookie/session 的機制而言,這像是個 key-value store,但以我們丟進去的 key 作為加密(不然網站早就都被 hack 光光

  • hothero
    hothero
rails

Rails Turbolinks & PJAX

前陣子在接觸 rails turbolinks 時想說 turbolinks 怎這麼 suck,光是 GA、Facebook Pixel 等 tracking script 無法正常運作就讓人十分頭痛(當時直接怒拔...),但在最近因為看了這篇文章 瞬間懂了。 Turbolinks 是在 Ruby on Rails 4.0 被默認的一個 gem,當時(2013年)很多人在分享時都搭上一句標題「Turbolinks for Rails (like pjax)」。那什麼是 pjax?turbolinks?更詳細解說可看上述提及的文章,這邊就針對一些所獲的重點摘錄做分享。 講什麼是 pjax 跟 turbolinks

  • hothero
    hothero
ruby

Ruby's Exception vs StandardError: 有什麼不一樣?

參考源於此:http://blog.honeybadger.io/ruby-exception-vs-standarderror-whats-the-difference/ 「Never rescue Exception in Ruby」 或許你可曾聽過這句話,但若不知道 Exception 與 Standard Error 的差別還真是讓人摸不著頭緒。 通常我們會在 Ruby 這樣 rescue exceptions begin do_something() rescue => e puts e # e is an exception object containing info about the error. end 但在看到這張表後馬上明白為什麼不能這樣寫 Exception

  • hothero
    hothero
nginx

Rails production hosting 數據分享

稍微分享一下最近一個 rails project hosting 的數據,站上同時有約6000人,有大量使用 view cache。 環境架設部分 nginx + unicorn (worker * 4) memcached server 512 MB(同一台機器...) Linode 2G 這是一個純新聞媒體的網站,觀察這樣架構下,面對同時 6000 人,機器 loading 大概約50%不到,粗估是可以到萬人以上水準。 若 memcached 搬出去,再把 worker 數量增加兩個,相信會再更好 :D

  • hothero
    hothero
wordpress

Optimizing mysql server

2014年因為工作需求,恰巧有機會調整到兩個台灣百大網站級的伺服器(infra structure),環境主要是 php 網站可執行的條件,有 laravel 開發的,也有放 wordpress 的,曾經最高同時在線人數約有5000~6000水準。以下就針對最近調整一台放 wordpress 的機器心得作分享,主要 mysql server 部分。 調整機器 performance loading 可從三個地方著手 Web Server DB Memory Usage (是否充分利用 memory cache) Web Server 部分可參考本站的PHP5-FPM with Nginx 效能調教 (1)與10 Tips For

  • hothero
    hothero
You've successfully subscribed to hothero's TechNote!