20日目
今日の学習
Ruby
Ruby本を読み進めていると、繰り返し処理から動きを変えるための制御機構例が出てきた。
最たる例であろうbreakなんかは、作ってみたクイズプログラムでも利用したことがある。
クイズを途中でやめる仕組みを作りたいと思っていたが、ぴったりの処理を見つけた。
break
では、繰り返し処理が入れ子になっている場合、一番内側の繰り返し処理を脱出するだけになる。
ここから、全ての処理まで脱出したい場合はどうすればいいか。
catch タグ do #処理を書く #自分の例だとクイズのプログラム throw タグ end
このように、throwメソッド
とcatchメソッド
を利用する。
大域脱出
というらしい。仰々しい名前だ。
自分はこれをクイズプログラムに組み込んで、もしも回答者がquitと入力したらその時点でプログラムを終了させるようにしてみたが、使い方は合っているだろうか。
とりあえず暫定的に完成させたので、gitにあげてみた。メンターの方に改善点などを仰ごうと思う。
Ruby on Rails
画像投稿機能
お馴染みの、画像投稿機能の実装の練習をした。
やんばるエキスパート教材 | 画像投稿機能(CarrierWave)
画像投稿機能用のgemは数種類あるようだが、今回はCarrierWave
というgemを利用させていただく。
テーブル設計時の注意
CarrierWave
を使用する際には、画像のファイル名を保存するimageカラム
を作成すること。
以下から、postsテーブルで作成した際の手順。
ビューファイルでの記述
gemをインストールし、postモデルにImageUploaderとpostsテーブルのimageカラムを連携させる。
その後、フォームに以下のコードを加えるだけで画像も選択できるようになる。
ブロック引数がformの場合は、
<%= form.file_field :image %>
コントローラで画像も受け取れるようにしておく必要がある。
画像を表示するためのコードは、
<%= image_tag @post.image.url %>
画像が存在するかどうかを確認するif @post.image?
を利用すると、画像があるときは画像を表示してくれるようになる。
以下、CarrieWave
に用意されている代表的なオプション。
app/uploaders/image_uploader.rb
にて
画像ファイル形式のバリデーション
extension_whitelist
で保存できるファイル形式の制限が可能
→フロント側でも、<%= form.file_field :image %>
にaccept
属性を加えるとバリデーションを入れられる画像ファイルサイズのバリデーション
size_range
メソッドで指定可能画像がない場合、デフォルト画像を表示させる<br<
default_url
メソッドの箇所をコメントアウトするpublic/images/fallback
ディレクトリにデフォルト画像を保存しておく画像ファイルの加工
ファイル形式を変更したり、リサイズができる。imagemagick
というジェムを利用するサムネイル画像を作成
サムネイル画像を読み込みたい場合は、image_tag@post.image.thumb.url
を利用する。
テーブルに新しくカラムを追加する
すでにテーブルがある状態で、カラムを追加する方法についての理解が曖昧だったので、再度確認。
マイグレーションに対する理解が甘すぎると日々感じる。
とても丁寧で分かりやすい記事。
Rails /テーブル作成、カラムの追加や削除[備忘録] - Qiita
自分の場合は、foods
テーブルに画像ファイル名を保存するstring
型のimage
カラムを今回は追加したいので、
rails generate migration AddImageToFoods image:string
このようにすればOKだった。この後rails db:migrate
で反映させることを忘れずに。
Git
ブランチを切り替えて作業するのを忘れていた!!!!!!
作業を少しだけ進めていたので、これは巻き戻してやり直すしかないか?と思っていた。
【Git】ブランチを切り替え忘れて作業してしまった時の対処法 - ばしぶろ
しかし、このスタッシュという機能を使用することで、今の変更点をそのままに、別のブランチに変えられるらしい。理想的だ。
早速これに則ろうと思ったが、そもそも前回の課題結果をmasterマージし忘れていたことを思い出し、masterブランチでプルもしていないし、どこかでやらかしたら怖いので、結局スタッシュ機能は今回使わなかった。
GitHubにあげている課題をpullして、新しい作業用のブランチを作ろうとしてもエラーが出る。
rror: pathspec 'ブランチ名' did not match any file(s) known to git
ブランチ名を微妙に変えたりしても駄目で、git fetch
してみても駄目。
git checkout タスク名
で切り替えようとしていたのがいけなかったようで、git switch -c ブランチ名
ならなぜか出来た。謎。