Rails로 기본 정보 기술자 시험의 과거 문제 사이트를 만든다(8:자동 해답편)

소개



유루~쿠 배운다. 모두의 웹 공부 커뮤니티. "뉴~부루회"를 운용중입니다.
htps // // 네 w부루. 기주 b. 이오/

거기서, 뭔가 교육용의 컨텐츠를 갖고 싶어~라고 생각하고, 이번 기획을 스타트했습니다!

Rails에서 기본 정보 기술자 시험의 과거 문제 사이트를 만듭니다!

최종 목표


  • 문제 및 답변 등록은 Scaffold에서 간단하고 OK
  • API를 준비하고 무작위로 문제를 추출하는 기능을 추가합니다
  • TwitterBOT, LINEBOT, SlackBOT이 가능하면 좋을 것입니다

  • 히스토리



    1: 구축편
    htps : // 코 m / 네 w 부루 / 있어 ms / 에 d59f47 아 c645b19620f6
    2:일본어화(i18n)편
    htps : // 이 m/네 w부루/있어 ms/4f12fdb61bf6cd601545
    3:부모와 자식 관계, 등록편
    htps : // 이 m / 네 w 부루 / 있어 ms / f2 아 20289
    4:부모와 자식 관계, 참조편
    h tps:// 퀵했다. 작은 m / 네 w 불 / MS / 51b11BD02691 그림 FC2 c0d
    5: API편
    htps : // 코 m / 네 w 부루 / 있어 ms / 89f9f847 아 2648 bd d006c
    6:SlackBOT편
    htps : // 이 m / 네 w 부루 / 있어 ms / 감히 b9 아 cb453이다 786bd59
    7 : Heroku 배포 ~ 자동화 편
    htps : // 코 m / 네 w 부루 / 있어 ms / 0 아 8 b02 에 1 8 c8 737 c7
    8:자동 해답편
     본 페이지

    이번에 할 일


  • Slack에 게시한 문제에 스레드에서 답변을 게시합니다.

  • Slack의 스레드로 게시합니다.



    1. SlackAPI의 스레드 게시물을 이해해 봅시다.



    ※참고
    htps : // 아피. scck. 코 m/메욘 ds/짱 t. 포스트 메시게
  • Slack.chat_postMessage의 응답에서 ts가 반환됩니다.
    ※이것이, 그 투고의 식별 ID가 되는 것 같습니다.
  • 투고시(Slack.chat_postMessage)의 옵션 「thread_ts」에, 방금전의 ts를 지정하면, thread로서 투고되는 것 같습니다.

  • 2. 게시한 기록을 기억할 모델에 추가합니다.




    이름
    물리적 이름
    금형
    비고


    문제 ID
    question_id
    숫자(integer)

    게시한 SlackTS
    slack_ts
    문자열(string)

    상태
    status
    숫자(integer)
    Enum 사용


    모델을 만듭니다.



    Scaffold
    例) rails g[enerate] model モデル名 カラム名1:データ型1 カラム名2:データ型2 …
    $ rails g model History question:references slack_ts:string status:integer
    

    DB 생성
    $ rake db:migrate
    

    상태(status)에 Enum을 설정합니다.



    models/History.rb
    class History < ApplicationRecord
      belongs_to :question
    
      enum status: {do: 0, done: 1}
    end
    

    3. 투고시에 이력을 보존합니다.



    게시 작업에 기록을 저장할 로직을 추가합니다.

    lib/tasks/slack_bot.rake
    namespace :slack_bot do
      desc 'ランダムに問題をSlackに書き込む'
      task :random_question => :environment do
      
      〜 中略 〜
    
        # text:出力テキスト、channel:出力先のチャンネル名、username:表示ユーザ名
        ret = Slack.chat_postMessage(text: msg, channel: ENV["SLACK_CHANNEL_NAME"], username: ENV["SLACK_BOT_NAME"])
    
        History.create(question: question, slack_ts: ret['ts'], status: :do)
      end
    end
    

    4. 수동으로 움직여 문제가 있는지 확인합니다.



    수동 실행
    rake slack_bot:random_question
    

    Histories 테이블에 레코드가 추가되면 OK입니다!

    5. 답변 게시 작업을 추가합니다.



    lib/tasks/slack_bot.rake
    namespace :slack_bot do
      desc '解答をSlackに書き込む'
      task :answer => :environment do
        # 未解答の履歴一覧を取得
        History.where(status: :do).each do |history|
          question = history.question
          answers = question.answers.where(correct: true)
    
          # 解答テキスト
          # HACK:ちょっと無理やり感があるので、リファクタ候補
          answer_msg = []
          first_answer = question.answers.order(:id).first
          answers.each do |a|
            answer_msg << "#{%w(   )[a.id - first_answer.id]}"
          end
          msg = "【解答】" + answer_msg.join("、")
    
          # thread_ts:投稿先スレッドTS、text:出力テキスト、channel:出力先のチャンネル名、username:表示ユーザ名
          Slack.chat_postMessage(thread_ts: history.slack_ts, text: msg, channel: ENV["SLACK_CHANNEL_NAME"], username: ENV["SLACK_BOT_NAME"])
    
          # 解答済みに変更
          history.update(status: :done)
        end
      end
    end
    

    6. 확인합시다.



    먼저 rake 작업으로 등록되어 있는지 확인합시다.
    $ rake -vT
    
    〜 略 〜
    rake slack_bot:answer                   # 解答をSlackに書き込む
    〜 略 〜
    

    그럼 실행!
    $ rake slack_bot:answer
    

    Slack을 확인하고, 이런 느낌이 표시되면 OK입니다!



    7. Heroku에 배포하고 Heroku Scheduler를 설정합니다.



    설정 방법에 대해서는 생략하겠습니다.

    주의점으로서는, 「문제 태스크」의 뒤에 「해답 태스크」를 움직이면, 즉답해 버리므로,
    "해답 작업"을 실행한 후 "문제 작업"을 실행하도록 설정합니다.
    ※이것으로, 다음의 태스크 실행시에, 전회 태스크로 기입된 문제에 해답이 기입되게 됩니다.

    이번에는 여기까지



    고마워요!
    다음번에는 또 언제 될지 모르겠지만… 💦
    기본 정보의 문제에는, 표가 포함되는 경우가 있기 때문에, 문제에 화상을 등록할 수 있도록(듯이) 하고 싶습니다.

    좋은 웹페이지 즐겨찾기