ActionMessageTexter
以 Rails ActionMailer 為參考打造的簡訊寄送模組,提供與 ActionMailer 一致的開發體驗
Installation
Add this line to your application's Gemfile:
gem 'action_message_texter'And then execute:
$ bundleOr install it yourself as:
$ gem install action_message_texterUsage
請先執行generator
rails g action_message_texter:texter ModuleName action_name action_name ....這將會產生以下文件
root
├─ app
│ └─ texters
│ ├─ application_texter.rb
│ └─ module_name_texter.rb
│
└─ config
└─ locales
└─ module_name.yml
使用上大致上跟Mailer差不多
# app/texter/my_texter.rb
class MyTexter
def my_ubereats(phone)
@order = "林東芳的半筋半肉牛肉麵"
@notes = "不要牛肉不要麵"
text(to: phone)
end
end與Mailer不同的是 簡訊內容不從View Render出來,請使用I18n,或是直接給 content
# config/locales/texter/my_texter.yaml
zh-TW:
my_texter:
my_action: 今晚我想來點%{order},%{note}# app/texter/my_texter.rb
def my_ubereats(phone)
...
# 也可以直接給文字,不走I18n
text(to: phone, content: "今晚我想來點#{order},#{note}")
end跟 ActionMailer 一樣,提供 deliver_now 跟 deliver_later 兩種寄送方式,deliver_now 會直接寄出,deliver_later會調用Job做寄出。
# 直接寄出,後續的動作需等待這個動作完成
MyTexter.my_ubereats("0987654321").deliver_now
# 調用Job,後續的動作繼續執行
MyTexter.my_ubereats("0987654321").deliver_latter於是 0987654321 就會收到這樣的簡訊
今晚我想來點林東芳的半筋半肉牛肉麵,不要牛肉不要麵
Configuration
設定簡訊傳送方式: 三竹簡訊 API
設定方式基本跟 ActionMailer 一模一樣
預設內建三竹簡訊,首先請設定網域,帳號,密碼,如果有需要Callback的話,請準備一下Callback Url
有計劃提供一個介面讓大家可以自己包自己的簡訊Api模組 到時候只需使用
add_delivery_method就可以加入自己的 Api 模組
-
Require
麻煩請先到config/application.rb新增require action_message_texter/engine -
設定三竹API
# config/application.rb config.action_message_texter.mitake_settings= { url: "三竹發給你的網域名稱 ex: https://smsapi.mitake.com.tw", username: "三竹的使用者名稱", password: "三竹的密碼", callback_url: "https://foo.bar.com/api/v1/callback" # 這行非必填 }
-
設定預設寄送方式
目前只有mitake一種寄送方式,因此預設就是這個,但若有需要的話在
app/application.rb裡,可以預設所有簡訊要使用哪一個寄送方式# app/application.rb #預設值為 :mitake config.action_message_texter.delivery_method = :mitake
基本上的設定方式都與ActionMailer相同,如果有不知道如何設定的,可以依照設定Mailer的經驗試試看喔
Message Object
Message 物件相當於 ActionMailer 中的 Message 物件,是簡訊的本體,Message 物件包含了這些東西
- uuid: 簡訊的ID
- to: 收件者
- content: 簡訊內容
- response: 簡訊 Api 的回覆 (此部分可以參考三竹簡訊API文件)
Callbacks
可以在Tester中加入 before_action 與 after_action,在這兩個方法中可以取得 message 物件。
class MyTexter
before_action :do_before
after_action :do_after
def do_before
...do_something
end
def do_after
...do_something
end
....Observer
若需要再寄送後,查看寄送是否完成?儲存寄送方式結果...等
可以註冊一個 Observer 或多個 Observer
class TexterObserver
def self.delivered_message(message)
# 請實作此方法
# 如傳送後儲存傳送結果
message_history = MessageHistory.find_by(uuid: message.uuid)
message_history.update(response_message: message.response.response_message)
end
end
class MyTexter
self.register_observer(TexterObserver)
# 您也可以註冊多組Observer
self.register_observer(OtherObserver)
endInspection
如了Observer 您也可以註冊攔截器 Inspection
class TexterInterceptor
def self.delivering_message(message)
# 請實作此方法
# 如測試站時加入測試站專屬訊息
message.content = "[test]#{message.content}" unless Rails.env.production
end
end
class MyTexter
self.register_interceptor(TexterInterceptor)
# 您也可以註冊多組攔截器
self.register_interceptor(OtherInterceptor)
endTest
小弟初次寫Gem 還不會寫測試 還請各位神人協助交流 感謝
License
The gem is available as open source under the terms of the MIT License.