2017年11月13日 星期一

ActiveSupport::Callbacks

延續上一篇,這邊用 ActiveSupport::Callbacks 來做 callbacks

官方教學:

http://api.rubyonrails.org/classes/ActiveSupport/Callbacks.html


下一個問題:

所以怎麼做到下面這個效果呢?

```ruby
class Test
extend ActiveModel::Callbacks

define_model_callbacks :execute

after_execute :log_something, only: [:index]

def index
puts "Hi World!"
end

def log_something
puts "Log something..."
end
end
```

或者是:

```ruby
class Test
include ActiveSupport::Callbacks
define_callbacks :execute


after_execute :log_something, only: [:index]

def index
puts "Hi World!"
end

def log_something
puts "Log something..."
end
end

```
呢?

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

extend ActiveModel::Callbacks

```ruby
class Test
extend ActiveModel::Callbacks

define_model_callbacks :execute

before_execute :log_something

def index
run_callbacks :execute do
puts "Hi World!"
end
end

def log_something
puts "Log something..."
end
end
```

運行結果:
```
Development [1] rocket(main)> Test.new.index
Log something...
Hi World!
nil
```

rails before_actoin design pattern - Aspect-oriented_programming (AOP)

想要對 ruby class 實作 before_action ,查到

https://stackoverflow.com/questions/23444964/is-it-possible-to-do-a-before-action-in-ruby-like-in-rails

於是看了一下 Aspect-oriented_programming (AOP)

https://en.wikipedia.org/wiki/Aspect-oriented_programming

看更簡單的解釋:
https://stackoverflow.com/questions/242177/what-is-aspect-oriented-programming

也不用解釋太多,其實就是 before_action 在做的事。

2017年11月8日 星期三

rails bootsnap 加速啟動



https://medium.com/@icarus4/speed-up-your-rails-project-boot-time-4d88c075f75d

2017年11月7日 星期二

前端怎麼透過 API 送 file 到後端比較好呢?

這幾天在做前端的 form,遇到了不知道該怎麼樣讓 JS 透過 API 送 file 比較好的問題,當然答案是「It depends」在這裡把我的想法記錄下來

送 file 的方法直覺想到會有幾種:

https://imququ.com/post/four-ways-to-post-data-in-http.html


基本上原生的 form 可以支援兩種方式:

* application/x-www-form-urlencoded
* multipart/form-data

但我想要讓我們的 API 都是走 application/json 的格式該怎麼辦呢?

另外一個方法是可以把 file encode 成 base64 的字串傳給後端

要了解每個方法的 pros and cons 可以看以下的討論串:

https://stackoverflow.com/questions/33279153/rest-api-file-ie-images-processing-best-practices

這次我還是選用 base64 走 application/json,原因跟上述很類似,因為

1. 可以讓所有 endpoint 都走 json
2. base64 是很好理解的格式,對 client 不太會造成太大困擾
3. 可以支援同時傳 file 和其他 input
4. performance 比較差沒錯,但可以接受




至於 JS client 轉 base64 就用 FileReader 就行了

```js
      const reader = new FileReader()
      reader.onload = (event) => {
        $.post({
          url: "/api/private/messages?order_token=aa325ea3-2f86-4866-865d-6c0771922a59",
          data: {
            message: {
              attachment: event.target.result
            }
          }
        }).done((data) => {
          console.log(data)
        })
      }
      reader.readAsDataURL(file)
```

2017年11月2日 星期四