9日目
- rails new で動かない不具合
- Ruby 側で整数型を int と書き間違えることによるエラー
- Rubyの整数型はinteger
- MySQL は int(C++経験上、int の方が馴染み深い)
- rails db:migrate コマでのエラー
- 中間テーブルを先に作ってしまったため
- 中間テーブルは主テーブルの id 等参照するので、作成は一番後
- 最適なデータ型を選択できなかった
不具合改善のなかで、Vagrantfile で、使用できる RAM のサイズを 8GB に変更
Environment
- 仮想環境 OS: Ubuntu 18.04
- Ruby:2.51
- Rails:5.2.2
作成データ
- テーブル
- student (id, name,email, gender, age, opinion, updated_at, created_at)
- ExamResult (id, student, subject, name, score, updated_at, created_at)
- Subject (id, name, max_score, updated_at, created_at)
- ClubStudent (id, student, club, name, updated_at, created_at)
- Club (id, name, updated_at, created_at)
準備
rails new
bundle install
rails db:create
scaffold(本段階
- scaffold では controller と model が作成される
- Ruby の整数型は integer
- 中間テーブルは一番最後に作成
- 主キーを参照する column を reference で指定
rails g scaffold
rails db:migrate
テーブル同士の relation 定義
マスターデータ作成
(0..20).map{('あ'..'わ').to_a[rand(26)]}.join
範囲オブジェクト
文字も使える
map
要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返す。
collect メソッドの別名です。
to_a(Array)
Array オブジェクトを返す
rand(max)
max が 0 の場合は 0.0 以上 1.0 未満の実数を、正の整数の場合は 0 以上 max 未満の整数を返す
join(sep =)
join メソッドは、配列の各要素を文字列に変換し、引数 sep を区切り文字として結合した文字列を返します。
引数を省略すると区切り文字なしで要素を結合した文字列になる
10日目
今回の流れ
- 中間テーブルにデータ入力
- 性別の 0 or 1 の表記を、male or female に変更
- Student の show ページに、生徒ごとの試験結果など、データを出力
実段階
Students の show ページの、前回までの状態
生徒データと関連付けするときは
データ入力
生徒の部活情報
id1 から id100 までの生徒に、0 から 4 個の部活(選択肢は 13 部)に入ってもらう。
生徒の試験結果情報
id100 までの生徒に、9 科目の試験を受けてもらう。
なお、点数は 0 点から各教科ごとに設定の最大点までのランダム
Studentsのindexページの表記を変更
出力を考える
- 学生ごとの show ページで表示したいもの
- 生徒のデータ(name, mail, gender, age, opinion)
- 生徒の教科ごとの試験結果点数
- 性と全体の試験結果の平均点、最大点、最小点
MySQL上の出力
ページ上の出力
students_controllerのshowアクション編集
showページのviewを編集
11日目
今回の流れ
- ExamResults の index ページのデータ出力を編集
- ExamRusult の新規作成ページの UI を変更
- gem kaminari でページャー追加
実段階a
modify index page
※app/views/exam_results/show.html.erb
も同様にやる
newページにセレクトボックス
編集後
student と ExamResult の index ページを、数ページに区切って表示させたい。
今回は gem の kaminari を用いる。
インストール
bundle install
studentのindexページから変更
index アクションを編集
view を編集
ExamResultのindexページ編集
app/controllers/exam_result_controller.rb
の index アクションと
app/view/exam_results/index.html.erb
を同様に編集
ページャの見た目を変える
ページャの設定を変える
Bootstrap 対応のページャテーマもある。
12日目
kaminariの別のファイル設定
- models に paginates_per 30 と記述
- controller の index アクションの末尾にある、per()を削除
exam_result も編集は同じ。
studentのindexページに、exam_resultのnewへのリンク作成
リンクを作成
student index から’New Exam Result’リンクを押すと、exam_result の new ページに飛び、フォームのセレクトボタンのうち、生徒が自動で選択される。
14日目
今週からは、scaffold で作成した大学データと、gem の devise、Bootstrap などを組み合わせる。
What I did
- Rails の命名規則(単数形と複数形)
- DB のカラム定義を後から変更
- render partial: 部分テンプレの参照
- validation
- UNSIGNEDという型が存在しないPostgreSQL
Railsの命名規則(単数形と複数形)
rails g コマンドで、controller 名や model 名を指定する際に、混乱した。
- model は単数形で、頭文字を大文字
- controller 名は複数形、頭文字を大文字
- 1 つの controller に複数の action が含まれるため
DBのカラム定義を後から変更
rails g scaffold
時に “refereces” とミスタイプしていた。
なお、ALTTER TABLE コマンドを使って、あとから修正する方法は
DB 内のデータを書き換えるだけで、アプリ自体のファイル等は編集されない。
つまり、原因の根本的な部分を修正できないので、駄目
render partial: 部分テンプレ
すべてのページのヘッダーに、ログアウトや他の student や clubs などのリンクを乗せる
共通して表示させるので、/app/views/layouts/application.html.erb を編集する。
なお、部分テンプレファイル名は『_』アンダースコア始まり
表示させたいリンクを書きこむ。
validation
バリデーションは有効なデータだけを DB に保存するのを確実にするための最善策。
validate条件
空白や文字列長、『サークル』という語には、validates が発動するが、『テニスサークル』だと発動しないので、正規表現などを使う必要がある。
type “unsigned” does not exist (※Postgresql)
validates の実装していく最中に、エラーに気づいた
student の edit ページで更新すると、
とエラーを吐き、ブラウザの戻るボタンで戻ると更新されている。
また、エラー原因であると思わる StudentController#show
は
因みに、この controller は、以前の大学データの controller からコピーしてきたものだ。
つまり、MySQL で動くアプリの controller。
unsigned (MySQL)
- MySQL においては正と負の整数を扱うことができる
- unsigned を指定すると、正の数しか格納できなくなり、代わりに範囲が 2 倍になる
- unsignedにした値が負になると、エラーを起こす
- UNSIGNED は、マイナス値が入らないだけでなく、マイナスになる計算もできない
- CAST で一時的に型を変えることで回避は可能
Postgresqlにはunsined型は存在しない(最重要)
対応するには
- unsigned を int などの型に置き換える
- 今回は試験点数を扱っていて、int で事足りると思われる
- ただ、MySQL で int unsigned だと、範囲が正の方向に 2 倍になっている
- 扱う数によっては、intより1つ上のbigintに変える必要がある
- CAST as unsigned の部分を消す
- MySQL で CAST as unsinged は、一時的に型を指定している
前回の大学データに倣って、今回は cast as int に変更した
正常に、student データの edit、update が機能した。
データ入力にはpassword情報が必要
devise の関係上、パスワード情報入りのデータでないと、コンソールから入力できない。
passwordカラムの追加
devise のモデルなどがある、Student テーブルに、パスワードカラムを追加した。
db/migrate 下にファイルが生成される
これで、パスワード情報入りの生徒データを DB に入力できる。
未だデータの無い、生徒データと試験結果データをコンソールで入力した。