Ruby instance_eval & block

```rb class Test def initialize(&block) @name = "Hello World" instance_eval(&block) if block_given? end def name @n...

Wayne

不要在 rake task 裡定義 method

因為 rake task 的 scope 是 global 的,如果在裡面定義 method 等於是為 Object class 定義 private method,污染全部的 code 可行的做法之一是把要跑的 task 寫成 service 執行 另外推薦的做法是...

Wayne

2018 Ruby Kaigi 網路上看到的懶人整理

* Matz considering alias yied_self with then * Rib, an alternative for irb * Stripe team building Ruby type checker https://blog....

Wayne

用 Ruby proc 做 success and error handler, like JS Promise

```rb # A base class for all classes implement calls to API. class ApiCall attr_reader :params def self.call(params) new(param...

Wayne

http.rb replace net::http

作者認為 Net::Http 雖然是 standard lib 之一,但 API 設計很不好,底層實作也有很多覺得不滿的地方,包含 Net::Http 的 Error 封裝方式,讓人不知道怎麼 rescue 有機會可以試用看看 https://github.com/h...

Wayne

ruby proc 可以傳default 值since ruby 1.9

所以 scope :latest, ->(size=5) { recent.limit(size) } 這樣是可以的 好廢的一篇文 呵呵

Wayne

一篇講 OO cohesion 和 coupling 簡單易懂的文章

一直想找個好方式跟同事解釋怎麼 decoupling 和 design better code,這篇文章涵蓋了最重要的兩個概念而且用很簡單易懂的 code 解釋了,很不錯。 cohesion: class 裡的 methods 是不是 share 一樣的 contex...

Wayne

新的做 soft delete 的 gem - discard

https://github.com/jhawthorn/discard 沒有 default 加上 default scope 我覺得是很棒的決定,這個 gem 留給開發者更多的彈性實作 soft delete,我覺得在大多數的 case 下都是很夠用...

Wayne

檢查 gem verison 的方法

在devise 裡看到的 ```rb def self.rails51? # :nodoc: Rails.gem_version >= Gem::Version.new("5.1.x") end def self.activerecord51? #...

Wayne

rspec test protocal (interface) - part 1 - define what's interface and find it

通常我們會希望繼承於 Base class 底下的 class 會有相同的 interface,for example, 每個 service 都要有一個 #call 的 instance method,應該要有個很簡單的方法來對這些 services 測試是否有 imp...

Wayne

little funny learn from ruby private

I usually make my private methods like this: ``` class Foo private def private_method end end ``` However, there is inline-style...

Wayne

kickstarter 的 event sourcing approach

也解釋了一些 event sourcing 相關的東西,還不錯的深入淺出好文,而且還有 gif 圖加分XD 這張就很棒的解釋了他們所謂的 Aggregation (綠色, state), Reactor (黃色), Calculator (藍色箭頭), Event (藍色...

Wayne

同時定義 class method 和 instance method 的潮潮寫法

You can delegate method to your `class` since your class is also a object in Ruby, interesting ```ruby class Foo def self.bar ret...

Wayne

Rspec aggregate_failures syntax

意思就是在 aggregate_failures block 底下任一個的 expectation 有 error 時會針對每個 expectation 顯示 error 的 message example ```ruby it "returns false ...

Wayne

PaperTrail whodunnit find object (ex: find User object)

PaperTrail::Verison object 的 methods 可以去 PaperTrail::VersionConcern 裡面查 查了一下沒有可以找到 whodunnit object 的方法,只好自己加一個: ```rb #initializers/p...

Wayne

看到一個不錯的 mock example (RSpec)

之前一篇文章提到 RSpec 盡量不用 let, 那要用啥?可以用 method。 另外看到一個不錯的 mock example, 用 tap 來 return double 但是 yield Authentictor ```rb def stub_authentica...

Wayne

Mutation in Ruby, it tells why more and more people like pure functional (immutable function)

Some mind blown examples: ```rb [1] pry(main)> list = Array.new(5, "foo") # => ["foo", "foo", "foo", "foo", "foo"] [2] pry(main)> list[...

Wayne

Ruby Array(params[:ids])

关于 Array(params[:ids] 这个用法,如果是 Array([1,2,3]) 会等同于 [1,2,3] 没变,但是 Array[nil] 会变成 [] 空数组,这可以让 .each 方法不会因为 nil.each 而爆错。如果不这样处理,在没有勾选任何 off...

Wayne

為什麼 ruby constant 要 freeze

因為 ruby 不會釋放 constant 的 memory,所以要 freeze,例如 ```rb class Test HELLO = "World".freeze end ``` 這樣就不會一直重複建立 memory,而只會建立一次 https://www....

Wayne

FactoryGirl 原來還可以在 factory 下面再用 factory

FactoryGirl 原來還可以在 factory 下面再用 factory 這樣就可以用 ``` create(:tiny_btc_account) ``` ``` FactoryGirl.define do factory :account do l...

Wayne

如何解決安裝 sql 相關 gem 時常常遇到的 error: Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

因為是用 Postgresapp 安裝的 postgres sql,所以常常 bundle install 的時候都會遇到 ``` Gem::Ext::BuildError: ERROR: Failed to build gem native extension. (0...

Wayne

終於在工作中實際用到了紅黑樹 - 交易所配對引擎

首先了解紅黑樹跟一般的二分查找樹的區別可以看下面連結中的漫畫,清楚明瞭: https://mp.weixin.qq.com/s/0RKuO0Pk7R09wGzgyA43mw 簡單來講最大的差別在於 二分查找樹有可能會左右極度不平衡,造成查找時效率變慢 而紅黑樹有自平衡...

Wayne

用 Ruby 實作 Elixir 的 cond statement

## Elixir: ``` defmodule Validator do def validate_age(age) do if age < 18 do "Under 18" else if age < 21 do ...

Wayne

Ruby keyword arguments

TL;DR: ```ruby def log_operator(operator: nil, **options) self.operator = operator end ``` 可以: ```rb log_operator(operator: ...

Wayne

用 ActiveModel::Callbacks 做 before, around, after callbacks

extend ActiveModel::Callbacks ```ruby class Test extend ActiveModel::Callbacks define_model_callbacks :execute before_execute :log_som...

Wayne