読者です 読者をやめる 読者になる 読者になる

コンパイラかく語りき

文系新卒プログラマーのメモ

文系プログラマーがRailsでロシア語アプリケーションをつくる⑯ ~単語のお気に入り登録~

どうも!chuckです。

前回までで、ユーザーがアカウントを登録して、サインイン・サインアウトすることが可能となりました。

まあRailsチュートリアルのおかげなんですが(;・∀・)

 

今回からはオリジナル要素として、単語クイズページを作成していきたいと思いますヽ(=´▽`=)ノ たぶん、全部で3回くらいに分けるかな??

 

chuckwebtips.hatenablog.com

 

 

 

要件

・単語クイズを1問、ランダムで出題

・ユーザーが答えを選択し、正誤判定を出す

・(サインインしてる場合のみ)出題された単語をお気に入り登録できる

まあ、ランダムで出題するのはできそうですね。問題はお気に入り登録かなあ…もういっこテーブル必要だよね???(;・∀・)

 

方向性を決める

さあ、作っていきます!もちろん、自力でRSpecも書いていきますよー(`・ω・´)ゞ

 

えーっと、、、、何から作ればいいんだろう…??

maeharin.hatenablog.com

めっちゃ役立ちそうなサイト様を発見!こちらから引用。

 

f:id:chuck0523:20150728220648p:plain

うーん、今回作るのは単語クイズのロジックとページだよね?ってことは、コントローラとビューが必要かな!

お気に入り登録するテーブルはまた別件だよね??でも、先にテーブル作っといた方がいいよね???

 

というわけで、modelつくります〜

 

さっそく手が止まる

えーっと…どうすればいいんだろう(データベース設計素人なので思考停止)

少なくとも1つテーブルは必要なはず。「お気に入り単語一覧」的な。1人のユーザーにつき、1つの「お気に入り」テーブルを持つんだよね。

そしてそのカラムは…?「単語一覧テーブル」の単語への参照キーだよね。

それだけ???でいいのかなあ??ヽ(´Д`;)ノアゥア…(パニックになる文系プログラマー

 

とにかく手を動かそう!

迷っても仕方ない!えいや!

f:id:chuck0523:20150728224200p:plain

UsersWordというモデルを作成しました。

 

f:id:chuck0523:20150728224336p:plain

db/migrate/[タイムスタンプ]_create_users_words.rb

こちらがマイグレーションファイル。

user_idがどのユーザーの単語であるかを、word_idがどの単語であるかを指しています(きっと)

 

rake db:migrate

f:id:chuck0523:20150728224606p:plain

テーブル追加しちゃったー!

 

リレーショナルを定義する

さて、ここで初めてリレーショナルを定義します。リレーショナル=関係です

今まで作成したユーザーと単語一覧との間にはなんの関係もありませんでした。しかし、今回のお気に入り単語は、どのユーザに属するか、どの単語を表しているかという情報を持ちます。つまり、他のモデルとの関係を持ちます。

 

こんな感じ。

f:id:chuck0523:20150728225249p:plain

Railsチュートリアル9章よりカンニング

 

dbではなく、appの方に追記するんですね!

 

えっと、お気に入り単語はユーザーに属していて(belongs_to)、

f:id:chuck0523:20150728231945p:plain

app/model/users_word.rb

 

 ユーザーはお気に入り単語を複数持つ(has_many)

f:id:chuck0523:20150728232114p:plain

app/model/user.rb

こんな感じでいいのかな??

 

あっ、お気に入り単語と単語一覧も結ばなきゃ!

 

お気に入り単語は単語を持っていて(has_one)、

f:id:chuck0523:20150728232854p:plain

 

単語はお気に入りに持たれる(belongs_to)

f:id:chuck0523:20150728232939p:plain

 

おし!これでモデルはオッケーなはず!

 

テストも書いた

ひとまずモデルが正しいことだけをテスト

f:id:chuck0523:20150728234250p:plain

 

まあ、モデルをチェックするだけだし行けるでしょ♪

 

f:id:chuck0523:20150728234315p:plain

 

えっ…(´;ω;`)

 

単語一覧のファクトリーがなかった

作った!

f:id:chuck0523:20150728234835p:plain

 

そしたら通った!\(^o^)/

f:id:chuck0523:20150728235012p:plain

 

ふー、ようやくモデルの完成か…

 

 

コントローラの作成

お待ちかねのコントローラの作成です!ヽ(=´▽`=)ノ

rails g controller WordQuizzes  quiz answer add

f:id:chuck0523:20150729225333p:plain

quizアクションが出題、answerアクションが回答、addアクションがお気に入り追加になります。

 

ランダム出題を作ってみる

さて、いよいよ出題を完成させたいと思います。

1, アクションを作成

f:id:chuck0523:20150729231506p:plain

app/controllers/word_quizzes_controller.rn

乱数をつかって、単語を1つランダムに取得しています。そして、その単語をquiz変数に格納。

 

2, ビューを作成

シンプルですが、取得した単語の単語名を表示させます。

f:id:chuck0523:20150729231452p:plain

app/views/quiz.html.erb

 

3, ルーティング

コントローラ生成の段階でルートは自動で設定されているのですが、quizアクションのみ、名前付きルートを設定しました。

f:id:chuck0523:20150729231826p:plain

 

いざ、ブラウザで確認

f:id:chuck0523:20150729232042p:plain

出ましたー!ランダムに1件取得できています。

リロードするとこの通り。

f:id:chuck0523:20150729232105p:plain

別の単語が表示されます!ヽ(=´▽`=)ノ

 

まとめ

ランダムで単語を取得して出題する機能を付けました!

次回は回答ページとお気に入り登録機能を作っていきます!ではヽ(=´▽`=)ノ