どうも!chuckです。
前回までで、ユーザーがアカウントを登録して、サインイン・サインアウトすることが可能となりました。
今回からはオリジナル要素として、単語クイズページを作成していきたいと思いますヽ(=´▽`=)ノ たぶん、全部で3回くらいに分けるかな??
要件
・単語クイズを1問、ランダムで出題
・ユーザーが答えを選択し、正誤判定を出す
・(サインインしてる場合のみ)出題された単語をお気に入り登録できる
まあ、ランダムで出題するのはできそうですね。問題はお気に入り登録かなあ…もういっこテーブル必要だよね???(;・∀・)
方向性を決める
さあ、作っていきます!もちろん、自力でRSpecも書いていきますよー(`・ω・´)ゞ
えーっと、、、、何から作ればいいんだろう…??
めっちゃ役立ちそうなサイト様を発見!こちらから引用。
うーん、今回作るのは単語クイズのロジックとページだよね?ってことは、コントローラとビューが必要かな!
お気に入り登録するテーブルはまた別件だよね??でも、先にテーブル作っといた方がいいよね???
というわけで、modelつくります〜
さっそく手が止まる
えーっと…どうすればいいんだろう(データベース設計素人なので思考停止)
少なくとも1つテーブルは必要なはず。「お気に入り単語一覧」的な。1人のユーザーにつき、1つの「お気に入り」テーブルを持つんだよね。
そしてそのカラムは…?「単語一覧テーブル」の単語への参照キーだよね。
それだけ???でいいのかなあ??ヽ(´Д`;)ノアゥア…(パニックになる文系プログラマー)
とにかく手を動かそう!
迷っても仕方ない!えいや!
UsersWordというモデルを作成しました。
db/migrate/[タイムスタンプ]_create_users_words.rb
こちらがマイグレーションファイル。
user_idがどのユーザーの単語であるかを、word_idがどの単語であるかを指しています(きっと)
rake db:migrate
テーブル追加しちゃったー!
リレーショナルを定義する
さて、ここで初めてリレーショナルを定義します。リレーショナル=関係です
今まで作成したユーザーと単語一覧との間にはなんの関係もありませんでした。しかし、今回のお気に入り単語は、どのユーザに属するか、どの単語を表しているかという情報を持ちます。つまり、他のモデルとの関係を持ちます。
こんな感じ。
dbではなく、appの方に追記するんですね!
えっと、お気に入り単語はユーザーに属していて(belongs_to)、
app/model/users_word.rb
ユーザーはお気に入り単語を複数持つ(has_many)
app/model/user.rb
こんな感じでいいのかな??
あっ、お気に入り単語と単語一覧も結ばなきゃ!
お気に入り単語は単語を持っていて(has_one)、
単語はお気に入りに持たれる(belongs_to)
おし!これでモデルはオッケーなはず!
テストも書いた
ひとまずモデルが正しいことだけをテスト
まあ、モデルをチェックするだけだし行けるでしょ♪
えっ…(´;ω;`)
単語一覧のファクトリーがなかった
作った!
そしたら通った!\(^o^)/
ふー、ようやくモデルの完成か…
コントローラの作成
お待ちかねのコントローラの作成です!ヽ(=´▽`=)ノ
rails g controller WordQuizzes quiz answer add
quizアクションが出題、answerアクションが回答、addアクションがお気に入り追加になります。
ランダム出題を作ってみる
さて、いよいよ出題を完成させたいと思います。
1, アクションを作成
app/controllers/word_quizzes_controller.rn
乱数をつかって、単語を1つランダムに取得しています。そして、その単語をquiz変数に格納。
2, ビューを作成
シンプルですが、取得した単語の単語名を表示させます。
app/views/quiz.html.erb
3, ルーティング
コントローラ生成の段階でルートは自動で設定されているのですが、quizアクションのみ、名前付きルートを設定しました。
いざ、ブラウザで確認
出ましたー!ランダムに1件取得できています。
リロードするとこの通り。
別の単語が表示されます!ヽ(=´▽`=)ノ
まとめ
ランダムで単語を取得して出題する機能を付けました!
次回は回答ページとお気に入り登録機能を作っていきます!ではヽ(=´▽`=)ノ