Rails로 기본 정보 기술자 시험의 과거 문제 사이트를 만든다(8:자동 해답편)
10421 단어 Rails기본 정보 기술자 시험slackbot슬랙루비
소개
유루~쿠 배운다. 모두의 웹 공부 커뮤니티. "뉴~부루회"를 운용중입니다.
htps // // 네 w부루. 기주 b. 이오/
거기서, 뭔가 교육용의 컨텐츠를 갖고 싶어~라고 생각하고, 이번 기획을 스타트했습니다!
Rails에서 기본 정보 기술자 시험의 과거 문제 사이트를 만듭니다!
최종 목표
히스토리
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의 스레드로 게시합니다.
1. SlackAPI의 스레드 게시물을 이해해 봅시다.
※참고
htps : // 아피. scck. 코 m/메욘 ds/짱 t. 포스트 메시게
※이것이, 그 투고의 식별 ID가 되는 것 같습니다.
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를 설정합니다.
설정 방법에 대해서는 생략하겠습니다.
주의점으로서는, 「문제 태스크」의 뒤에 「해답 태스크」를 움직이면, 즉답해 버리므로,
"해답 작업"을 실행한 후 "문제 작업"을 실행하도록 설정합니다.
※이것으로, 다음의 태스크 실행시에, 전회 태스크로 기입된 문제에 해답이 기입되게 됩니다.
이번에는 여기까지
고마워요!
다음번에는 또 언제 될지 모르겠지만… 💦
기본 정보의 문제에는, 표가 포함되는 경우가 있기 때문에, 문제에 화상을 등록할 수 있도록(듯이) 하고 싶습니다.
Reference
이 문제에 관하여(Rails로 기본 정보 기술자 시험의 과거 문제 사이트를 만든다(8:자동 해답편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/newburu/items/f2f0add5e01c2f10b474
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Rails로 기본 정보 기술자 시험의 과거 문제 사이트를 만든다(8:자동 해답편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/newburu/items/f2f0add5e01c2f10b474텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)