rails

A collection of 25 posts

rails

[Tutorial] how to dump and restore postgresql from production env on AWS EC2 for Rails

自從機器從 heroku 搬到 AWS 上後,資料庫的備份再也不是容易的事情惹,中間牽扯到 firewall, VPC, postgresql version 等等的問題,有點被 heroku 寵壞。過了一年多,終於有時間好好正視這個問題處理一下,不然常常很多特殊交易狀況都無法在開發環境被還原。 雖然找到許多的 gem 可以協助做這件事情,但用起來都不符合需求,後面再來提。最後還是用最土砲的方式:rake task 加上 postgresql cli 搞定。 資料庫版本 第一個會遇到的問題是資料庫版本不符合,RDS 用的 postgresql 是 9.5,但透過 opsworks 建的 ubuntu 環境 postgresql

  • hothero
    hothero
rails

has_many through association records duplication problem with Subquery solution

Rails 有非常完整的 ORM 機制,也是許多網站框架還難以超越的部分,其中的 has_many, has_one, belongs_to 等等的 association 拯救了不知多少工程師的白頭髮,讓大家少花了多少打 SQL 語法的歲月.....但近期著實被 has_many through 狠狠地上了一課,主要是 join 導致加總了重複的紀錄,使得金額與數量計算上出現大幅的落差。 先簡述一下我們的系統,就是一個電商架構的網站,其中 Transaction 與 TransactionItem 用來記錄每一筆交易買了哪些商品,那每個專案則理所當然的透過 transaction_items 來去找到 transaction_record 加總金額,即可知道共收到了多少錢。 (這邊姑且先不探討關聯設計上的問題,先針對

  • hothero
    hothero
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
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
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
ruby

[Troubleshooting]incompatible character encodings: UTF-8 and ASCII-8BIT

最近把放在heroku上的rails專案,其上傳檔案paperclip的storage改至S3上,當一上傳中文檔名便會發生"incompatible character encodings: UTF-8 and ASCII-8BIT"這樣的編碼問題。若錯誤訊息是"... ASCII-8BIT and UTF-8",則解法1的編碼需改成UTF-8。 解法1(適用於筆者) 註:在處理上傳的params前加入這兩行,team為該model name,avatar為檔案上傳的名稱,可依照需求自行修改。 params[:team][:avatar].original_filename.force_encoding('ASCII-8BIT') params[:team][:avatar].headers.force_encoding('ASCII-8BIT') 解法2 針對config/

  • hothero
    hothero
TroubleShooting

Error : cache: [GET /admin] miss&quot; on Heroku

最近將Rails專案(3.2 with ruby 1.9.3)放置heroku發生了/admin 連結miss的問題,查了很久發現不是rails_admin的問題,而是cancan這套認證gem的問題。 解決方法 1. 將application_controller.rb內的cancan設定改成: {% codeblock lang:ruby %} rescue_from CanCan::AccessDenied do |exception| redirect_to root_url, :alert => exception.message end 2. 在routes.rb內的root :to =&gt; "

  • hothero
    hothero
rails

migrate DB from sqlite to mysql for RoR on Heroku

之前做PHP project為了方便建立資料庫,利用rails scaffold快速建立表單放在heroku上讓其他人以便輸入資料,而rails預設資料庫為sqlite,本以為sqlite migrate到mysql很簡單,沒想到有些tricky,在此將步驟整理出來。 步驟如下: heroku db:pull --app appname 先從heroku上把資料抓下來 http://devcenter.heroku.com/articles/taps#export_pull_from_heroku 下載sqlitestudio程式(或其他可export sqlite為.sql檔案的程式) http://sqlitestudio.one.pl/index.rvt?act=docs 利用sqlite軟體(sqlitestudio)讀取sqlite資料並export成sql檔案,路徑為:db/development.

  • hothero
    hothero