토끼를 키우면서 웹 애플리케이션을 하는 이야기.

11199 단어 rails5.2
개요
  • 토끼 키우기 시작했다
  • 웹 애플리케이션으로 요구 사항 파악
  • 코드
  • https://github.com/junara/usareco
  • https://usareco.herokuapp.com에서 사용합니다.그러나 등록 사용자(자신)가 아니면 오류가 발생하여 링크가 없습니다.
  • 토끼 알의 양을 계산하는 것은 매우 번거롭다
  • 체중*x%로 결정
  • XX는 체중과 월령의 함수에 따라 계산
  • 매일 계산하기 귀찮다
  • 하고 싶은 일
  • 몸무게의 크기를 바로 알고 싶어요
  • 만든 물건
  • 체중을 듣고 과립량의 BOT
  • 로 돌아간다
    만든 물건

    전체 이미지



    관련 비디오
  • (토끼의 생일 등록)
  • 및 1000 투고의 예

  • 내 아이 BOT가 과립량 50.0g
  • 을 알려줬어요.
  • (추가) 기고문은 DB에 오늘의 기록으로 저장됩니다.

  • 슬랙이 콜라보레이션하는 곳.

  • 참고 자료
  • https://qiita.com/takose/items/bc2b63426b9921604599
  • https://blog.engineer.adways.net/entry/2017/08/18/120000
  • https://blogahf.blogspot.com/2018/08/slack-event-api-bot-logicflow.html

  • Slack Event API
  • slack 이벤트api로 응용 프로그램 만들기
  • Event subscriptions:
  • Request URL: /api/rabbits/:token/slack:token는 각 rabbit 고유의 token입니다.)사전 제작
  • Subscribe to Workspace Events: message.channels
  • Bot User: 적합한 이름으로 만듭니다.이번에usagi
  • Incoming Webhooks: 특정 채널(이번은#rabbit에서 BOT는 회답에 사용할 웹 훅 URL을 얻었습니다.DB에 URL을 미리 넣습니다(rabbit.slack webhook URL).
  • 상기 응용 프로그램을 관리 화면에서 slack에 설치

  • Rails 측에서 상술한 포스터를 받아들인 후 다음과 같은 조작을 실행한다
  • 메시지의 숫자를 오늘의 체중으로 저장
  • 체중에서 과립량 계산
  • Incoming webhook을 통해 슬랙에 투고
  • (점)Bot에서 slack에 투고할 때 불이 나는 것을 방지하기 위해@body['event']['subtype'] == 'bot_message'slack통지
  • 슬랙에 대한 투고에gemslack-notifier
  • 사용
    app/controllers/api/rabbits_controller.rb
    class Api::RabbitsController < Api::ApplicationController
      protect_from_forgery except: [:slack]
    
      def slack
        rabbit = Rabbit.find_by(token: params[:token])
        return unless rabbit.present?
    
        body = JSON.parse(request.body.read)
        case body['type']
        when 'url_verification'
          render json: body
        when 'event_callback'
          unless from_bot?(body) # BOTが無限に会話しないようにユーザーからの発言のみに応答するため
            num = body['event']['text'].match(/\d+/).present? ? body['event']['text'].match(/\d+/)[0] : nil # 数値を正規表現で取得
            feeding = rabbit.feeding(date: Time.current) # 今日の日付
            if feeding.body_weight.present? # newの場合
              feeding.body_weight.update(gram: num)
            else # updateの場合
              feeding.builds
              feeding.body_weight.assign_attributes(gram: num, scaled_at: Time.current)
              feeding.body_weight.save
            end
            if rabbit.slack_webhook_url # slackへ投稿。予めwebhook_urlを取得してDBに入れておく。
              notifier = Slack::Notifier.new(rabbit.slack_webhook_url)
              message = "ぼくの体重は#{feeding.body_weight.gram}g。ペレットは1日#{rabbit.ideal_pellet_gram&.round(1)}gでおねがいね![くわしくはこちら](#{root_url}) 。"
              notifier.ping(message)
            end
          end
          head :ok
        end
      end
    
      private
    
      def from_bot?(body)
        body['event']['subtype'] == 'bot_message'
      end
    end
    
    공의 수를 계산하는 것은 여기에 있다.
    app/models/rabbit.rb
      def ideal_pellet_gram
        return unless latest_body_weight
        latest_body_weight_gram = latest_body_weight.gram
        coefficient = if latest_body_weight_gram < 400
                        0.07
                      elsif age_of_month <= 6
                        0.05
                      elsif age_of_year < 5
                        0.02
                      elsif age_of_year >= 5
                        0.01
                      end
        latest_body_weight_gram * coefficient
      end
    
    첨부(웹 화면)
  • 투고한 몸무게가 DB에 축적
  • 우리 아이의 성장도를 봐라☺️
  • chartkick에 도표 그리기
  • gem 'chartkick'
  • 좋은 웹페이지 즐겨찾기