プログラミング備忘録

プログラミングの学習状況をメモしています

20日目

今日の学習

Ruby

Ruby本を読み進めていると、繰り返し処理から動きを変えるための制御機構例が出てきた。

最たる例であろうbreakなんかは、作ってみたクイズプログラムでも利用したことがある。

クイズを途中でやめる仕組みを作りたいと思っていたが、ぴったりの処理を見つけた。

breakでは、繰り返し処理が入れ子になっている場合、一番内側の繰り返し処理を脱出するだけになる。

ここから、全ての処理まで脱出したい場合はどうすればいいか。

catch タグ do
   #処理を書く
   #自分の例だとクイズのプログラム
   throw タグ
end

このように、throwメソッドcatchメソッドを利用する。

大域脱出というらしい。仰々しい名前だ。

自分はこれをクイズプログラムに組み込んで、もしも回答者がquitと入力したらその時点でプログラムを終了させるようにしてみたが、使い方は合っているだろうか。

とりあえず暫定的に完成させたので、gitにあげてみた。メンターの方に改善点などを仰ごうと思う。

GitHub - git-miura/quiz_game

Ruby on Rails

画像投稿機能

お馴染みの、画像投稿機能の実装の練習をした。

やんばるエキスパート教材 | 画像投稿機能(CarrierWave)

画像投稿機能用のgemは数種類あるようだが、今回はCarrierWaveというgemを利用させていただく。

GitHub - carrierwaveuploader/carrierwave: Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks

テーブル設計時の注意

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 ブランチ名ならなぜか出来た。謎。