Railsで基本情報技術者試験の過去問題サイトを作る（１：構築編）


# はじめに
ゆる〜く学ぶ。みんなのWeb勉強コミュニティー。　「にゅ〜ぶる会」を運用中です。
https://newburu.github.io/

そこで、何か教育用のコンテンツが欲しいなぁ〜と思い立ち、今回の企画をスタートしました！

Railsで基本情報技術者試験の過去問題サイトを作ります！

# 最終目標
- 問題・回答の登録は、Scaffoldで簡易でOK
- APIを用意して、ランダムに問題を抽出する機能を追加する
- TwitterBOT、LINEBOT、SlackBOTが出来たら良いな

# 履歴
１：構築編
　　本ページ
２：日本語化(i18n)編
　　https://qiita.com/newburu/items/4f12fdb61bf6cd601545
３：親子関係、登録編
　　https://qiita.com/newburu/items/f2a20289be5ec1fc1b77
４：親子関係、参照編
　　https://qiita.com/newburu/items/51b11bd02691efc2cc0d
５：API編
　　https://qiita.com/newburu/items/89f9f847a2648bdd006c
６：SlackBOT編
　　https://qiita.com/newburu/items/aeeb9acb453da786bd59
７：Herokuデプロイ〜自動化編
　　https://qiita.com/newburu/items/0a8bb02e1e8c8fe737c7

# 今回やる事
- DBを作る
- 問題用のマスタ登録画面を作る
- 回答用のマスタ登録画面を作る

# モデル(DB)を考える
RailsでWebサイトを作るので、最初はまず、モデル（DB）の構成を考えましょう。

問題を表示するサイトなので、必要なモデルは以下の通り。

**問題用モデル(Questions)**

|名前|物理名|型|備考|
|:--:|:--:|:--:|:--:|
|カテゴリ１|category1|文字列(string)|何年度か？|
|カテゴリ２|category2|文字列(string)|春か秋か？|
|カテゴリ3|category3|文字列(string)|何問目か？|
|問題文|msg|文字列(text)|問題文を登録|
※他試験の過去問も登録出来るように、「カテゴリ」という分類で分けることにします。

カテゴリ１〜３という変な構成になってしまっていますが…
IPAの過去問利用規約に則り、出典を記載する必要があるため、この様な構成になっています。
ご理解ください。
<img width="611" alt="IPA過去問利用規約" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/b0db5fc5-6214-b5bf-2a62-ee36f99c4dfa.png">

**回答用モデル(Answers)**

|名前|物理名|型|備考|
|:--:|:--:|:--:|:--:|
|問題ID|question_id|参照|どの問題の回答かを紐付ける|
|回答|msg|文字列(string)|回答を登録|
|正誤フラグ|correct|YES/NO(boolean)|正解の場合はtrue(1)|


# では、作っていきましょう
rails newを使って、アプリケーションを作成します。
※アプリケーション名は、「**quiz**」とします。

```terminal:rails-new
rails new quiz -d mysql
```
※MySQL派なので、DBを指定していますが、自由に変更してください。
　ただし、本稿ではMySQLを使って説明していきます。ご了承下さい。

次に、DBを作成

```terminal:DBを作成
$ rake db:create
Created database 'quiz_development'
Created database 'quiz_test'
```

ここまでは、いつも通りですね。

ブラウザで動くか確認

```terminal:rails-server
$ rails s
```

ご存知、次の画面が出ればOKです！
<img width="629" alt="Rails起動画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/8e1930e5-8cea-92d4-0490-664e104f6fcc.png">

# Slimを適用する
開発を効率よくするために、テンプレートエンジンをerbからslimに変更します。
※erbのままが良い人や、Haml派の方は飛ばして頂ければ構いません。
　ただし、本稿ではslimを使って説明していきます。ご了承下さい。

Gemfileに追記して、bundle install

```ruby:./Gemfile
gem 'slim-rails'
```
```terminal:bundle-install
$ bundle install
```

デフォルトのテンプレートエンジンをslimに変更します。

```ruby:config/application.rb
class Application < Rails::Application
  config.generators.template_engine = :slim
end
```

# Scaffoldで骨組みを作ってしまいましょう
Scaffoldを使って、サクッと作ってしまいましょう！

```terminal:Scaffold
例） rails g[enerate] scaffold モデル名 カラム名1:データ型1 カラム名2:データ型2 …
$ rails g scaffold Question category1:string category2:string category3:string msg:text
$ rails g scaffold Answer question:references msg:text correct:boolean
```

```terminal:DB作成
$ rake db:migrate
```

# では、確認します

```terminal:rails-server
$ rails s
```

起動させて、http://localhost:3000/questions/ にアクセスします。

問題一覧画面はこんな感じに。
<img width="322" alt="問題一覧画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/b29f446d-756b-9ec0-24ef-09aa8ea9ee5f.png">

新規作成画面は、こんな感じですね。
<img width="251" alt="問題新規作成画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/9b45e446-c17b-488e-f26a-43b7189db7d5.png">


# 今回はここまで
ありがとうございました！
次回は、日本語化(i18n)していこうかな。