🚀

Slack 通知を試す

2022/02/12に公開

Slack 通知を試す

Webhook アドレスを作成する

いつもの初期動作

rails new slack_notify -d mysql -B --skip-test
rails webpacker:install
bundle install
bundle exec annotate
bundle exec rails g annotate:install
rails g scaffold user name email login
rails db:create
rails db:migrate

追加Gemfile

  • メインは slack-notifer 。
  • dotenv は今回 webhook アドレスを管理するのに〜っと、思ったがpublic repositoryなので、credentials に入れ直した。ENVについては Channel名 を入れるのに使った。
  • annotate は便利& pryはデバッッグ用でいつも入れてるやーつ。
gem 'slack-notifier'
gem 'dotenv-rails'
gem 'annotate'
gem 'pry-rails'
gem 'pry-byebug'

初期確認

  • 立ち上げて、 http://127.0.0.1:3000/users の scaffold が見えればok
    • scaffold (スキャフォルド)って ff 連続してなければ読める気がする
    • ちょいっと素振りする時に便利ですよね。
rails s

Model ( app / model / slack_notifier.rb )

class SlackNotifier
  WEBHOOK_URL = Rails.application.credentials.dig(:SLACK_WEBHOOK)
  USER_NAME = "slack-notifier"

  def initialize
    channel = Rails.env.production? ? ENV['SLACK_PROD_CHANNEL'] : ENV['SLACK_NON_PROD_CHANNEL']
    @client = Slack::Notifier.new(WEBHOOK_URL,
                                  channel: channel,
                                  username: USER_NAME,
                                  unfurl_links: true,
    )
  end

  def send message, title: "Title", coloer: "#00ff00"
    message = {
      "color": coloer,
      "pretext": title,
      "fields": [
        {
          "value": "```" + message + "```"
        }]
    }
    @client.post attachments: message
  end
end
  • ちょっと動かしてみる
[1] pry(main)> SlackNotifier.new.send("Send Message")
=> [#<Net::HTTPOK 200 OK readbody=true>]

Contoller ( app / controllers / users_controller.rb )

ユーザ新規登録時に追加してみる

  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        SlackNotifier.new.send(@user.name, title: "新規ユーザが追加されたよ...!")


ユーザ削除してみる

  # DELETE /users/1 or /users/1.json
  def destroy
    @user.destroy

    respond_to do |format|
      SlackNotifier.new.send(@user.name, title: "ユーザが削除されたよ...!", coloer: "#ff0000")

悩み(というか手抜き?)

  • Coler 指定が手間...。処理中で実際に使う時になったらもうちょっと扱いやすくしたいな。
  • Log level に合わせるとか、 Event level に合わせるとか
  • とりあえず、カラー変更と通知チャンネルの切り替えができればええかなぁ、と。

ハマった...。

  • env を更新しても rails c で反映されず・・・。しばらく悩んだが、 spring stop で反映され、Rails.env による通知先切り替えが出来るようになった。

Discussion