クジラの練習帳006
練習帳006(条件式の種類)
今回は問題ではなく、疑問に思ったことを調べていきたいと思います。
条件分岐
条件分岐を書く場合は、if文やcase文、unless文などがありました。それぞれの強みを調べていきたいと思います。
if文の特徴
if文は一番シンプルな条件式です。
if <条件式1>
条件式1がtrueだった時の処理
elsif <条件式2>
条件式2がtrueだった時の処理
else
条件式2がfalseだった時の処理
end
条件式の真偽によって行う処理を変更していきます。
if ~がtrueなら処理を行い、falseで条件式を続ける場合はelsif ~に降ります。
条件式を抜け、falseでの処理を行う場合はelseで書きます。条件分岐の終わりにendを置きます。
unless文の特徴
unlessはifの反対で、条件式がfalseの時に処理を行います。
unless <条件式1>
条件式1がfalseだった時の処理
else
条件式1がtrueだった時の処理
end
また、elsifは使えません。
case文の特徴
case文は条件をさらに詳しく、また多くしたい時に使います。
case 対象オブジェクト
when 値1
値1と一致する場合に行う処理
when 値2
値2と一致する場合に行う処理
when 値3
値3と一致する場合に行う場合
else
どの値にも一致しない場合
end
同じ内容をif文で書くとこんな感じ
対象オブジェクト
if 対象オブジェクト == 1
値1と一致する場合に行う処理
elsif 対象オブジェクト == 2
値2と一致する場合に行う処理
elsif 対象オブジェクト == 3
値3と一致する場合に行う処理
else
どの値にも一致しない場合
end
どちらが読みやすいでしょうか?
case文はif文で代用ができると思いますが、条件が増えても可読性が保てる利点があります。
case文の例文
puts "誕生月を入力してください。"
month = gets.to_i
case month
when 1
puts "睦月"
when 2
puts "如月"
when 3
puts "弥生"
when 4
puts "卯月"
when 5
puts "皐月"
when 6
puts "水無月"
when 7
puts "文月"
when 8
puts "葉月"
when 9
puts "長月"
when 10
puts "神無月"
when 11
puts "霜月"
when 12
puts "師走"
else
puts "範囲外の値です"
end
ルーティングの設定
前回の振り返り
前回はマイグレーションファイルを編集し、テーブルの作成を行いました。
ルーティング
ルーティングとは、リクエストの行先を指定したり、新たに定義したりなど。
もっと詳しく▶︎ルーティングとは、ネットワーク上でデータを送信・転送する際に、宛先アドレスの情報を元に最適な転送経路を割り出すこと。特に、インターネットなどのIPネットワークにおいて、パケットの転送先を決定すること。
なんとなく理解できるレベル(・・;)
Railsでは7つのアクションに分割して処理を行います
index:一覧表示
show:詳細表示
new:生成
create:保存
edit:編集
update :更新
destroy:削除
ルーティングの生成
resourcesメソッドは、7つのアクションへのルーティングを自動生成するメソッド。
config/routes.rb
Rails.application.routes.draw do resources :tweets end
以下のように7つのアクション全てをルーティングを設定したことになる。
確認には、rails routesコマンドを用います。ターミナルでコマンドを実行するとルーティングを確認できます。
ターミナル
GET /tweets(.:format) tweets#index POST /tweets(.:format) tweets#create GET /tweets/new(.:format) tweets#new GET /tweets/:id/edit(.:format) tweets#edit GET /tweets/:id(.:format) tweets#show PATCH /tweets/:id(.:format) tweets#update PUT /tweets/:id(.:format) tweets#update DELETE /tweets/:id(.:format) tweets#destroy
onlyオプションは、指定したアクションのみのルーティングを自動生成する。
config/routes.rb
Rails.application.routes.draw do resources :tweets, only: :index end
ターミナル
GET /tweets(.:format) tweets#index
不要なアクションが存在すると、余分なエラーを生む可能性があるため絞る必要があるのです。
これで一覧表示に向けたルーティングが設定ができました。
まとめ
ルーティングの生成には、routes.rbでresourcesメソッドを使いましょう。欲しいルーティングが決まっている、開発途中などはonlyオプションを用いて不要なルーティングは生成しないようにしましょう。
ルーティングの確認にはrails routesコマンドを用いましょう。
次回
クジラの練習帳005
練習帳005(条件分岐)
ターミナルから数字を入力し、数字に応じて以下のように出力するプログラムを書きましょう。
0以下の数値の場合、0以下の値です
10以上の数値の場合、10以上の値です
1以上9以下の数値の場合、0より大きく10より小さい値です
input = gets.to_i # ここからソースコードを書いてください
以下は回答
回答
input = gets.to_i if input <= 0 puts "0以下の数字です" elsif input >= 10 puts "10以上の数字です" else puts "0より大きく10より小さい数字です" end
1行目で数値をコンソールから入力できます
3行目から条件分岐処理です。
条件分岐の書き方は、
if 条件1 # 条件1にtrueのときの処理 elsif 条件2 # 条件2にtrueのときの処理 else # 条件2にfalseのときの処理 end
となっています。
クジラの練習帳004
練習帳004(配列を扱う)
以下のように配列の中でしりとりをしました。
この配列をshiritoriとします。要素数が不明の状態で配列の中から最後の要素を取得しましょう。
shiritori = ["りんご", "ゴリラ", "ラッパ", ..(途中は省略)..,"ウサギ"] puts [A]
[A]に当てはまる、この配列の最後の要素のみを取得するプログラムを書く。
以下は回答
回答
shiritori = ["りんご", "ゴリラ", "ラッパ", ..(途中は省略)..,"ウサギ"] puts shiritori[shiritori.length - 1]
今回の問題は要素数がわからない点です。
003でやったlengthメソッドを用います。lengthメソッドを使えば正確な要素数を取得することができます。
shiritori.length
最後の要素は[配列の要素数 - 1]とすることで取得ができます。
配列内の要素への添字は0から数えるためです。
fruits = ["みかん", "りんご", "ぶどう"] animals[animals.length - 1]
#ぶどうと出力される
クジラの練習帳003
練習帳003(配列を扱う)
以下のように配列の中でしりとりをしました。
この配列をshiritoriとします。何回しりとりが出来たか配列の中から取得しましょう。
shiritori = ["りんご", "ゴリラ", "ラッパ", "パンダ", ”ダチョウ", "ウサギ"] puts [A]
[A]に当てはまる、配列の中の要素数を取得するプログラムを書きましょう
以下は回答になります
回答
shiritori = ["りんご", "ゴリラ", "ラッパ", "パンダ", ”ダチョウ", "ウサギ"] puts shiritori.length
#数値の6が出力される
要素の取得にはlengthメソッドを使用します。配列.lengthと書くことで配列内の要素を数値として取得することができます。
テーブルの作成
前回の復習
前回は、コマンドを使用してモデルの作成まで行いました。
テーブル
▶︎テーブルとは、データベース内に作成される、データを表形式で格納する場所。データベースには目的に沿ったテーブルが用意される。
追加でレコードとカラムも説明します
▶︎表形式で行をレコード。列をカラムと呼びます。
めっちゃ分かりやすくまとめられていました。⬇️
マイグレーションを元にテーブルを作成
▶︎マイグレーションとは、テーブルの仕様書・設計図のこと。
▶︎テーブルはマイグレーションファイルを元に作られています。目的に沿ったテーブルを作るため、仕様を書いていきます。
前回のrails g modelコマンドで一緒にマイグレーションファイルも作られています。
以下のように編集します。
db/migrate/20XXXXXXXXXX_create_tweets.rb
class CreateTweets < ActiveRecord::Migration[6.0] def change create_table :tweets do |t| t.string :name t.string :text t.text :image t.timestamps end end end
t.に続くのが「型」で、:に続くのが「カラム名」になります。
カラム名の型
カラムの型 | 説明 | 用途 |
---|---|---|
integer | 数値 | 金額、回数など |
string | 文字(短文) | ユーザー名、メールアドレスなど |
text | 文字(長文) | 投稿文、説明文など |
boolean | 真か偽か | はい・いいえの選択、合格・不合格のフラグなど |
datetime | 日付と時刻 | 作成日時、更新日時など |
マイグレーションファイルにデフォルトでt.timestampsとありますが、こちらはcreated_atとupdated_atというカラムを作成してくれます。こちらは、データ登録(更新)の日時を記録してくれます。
マイグレーションの実行
マイグレーションに記述した内容を、データベースに適用します。
これはrails db:migrateコマンドを使用します。
ターミナル
# マイグレーションの実行(tweetsテーブルの作成) % rails db:migrate
以下のような表示が出れば成功です
# 下記のような結果が出力されれば成功です。(数字等は変化します) == 20200306015943 CreateTweets: migrating ===================================== -- create_table(:tweets) -> 0.0148s == 20200306015943 CreateTweets: migrated (0.0149s) ==================
テーブルができたか確認していきます。
Sequel Pro
テーブルの視覚化をしてくれるアプリケーション
もし入れる場合は、こちらを参考にしてみてください
マイグレーションの修正
マイグレーションは、一度実行すると上から更新することができない仕様になっています。そのため、マイグレーションを一度差し戻す必要があります。
修正をするために以下二点のコマンドを追加で覚えます。
rails db:migrate:statusコマンド
▶︎マイグレーションファイルの状況を確認するコマンドです。
ターミナル
# マイグレーションファイルの状況を確認 % rails db:migrate:status
# 以下のような出力が出れば成功
database: first_app_development Status Migration ID Migration Name -------------------------------------------------- up 20190820071210 Create posts
rails db:rollbackコマンド
▶︎マイグレーションの差し戻すためのコマンドです。
ターミナル
# マイグレーションファイルの差し戻し
% rails db:rollback
修正を行う場合は、状況の確認→差し戻し→修正→マイグレート→状況の確認と一段階ずつ行います
まとめ
今回はテーブルの作成、またマイグレーションを中心に行いました。
複雑なプログラムになるとこれとは比べ物にはならないくらいに難しいですが、基本は何より重要です。
クジラの練習帳002
練習帳002(変数の定義と使い方)
テストの平均点を出力して欲しい。
国語が80点、数学85点、英語50点、歴史75点、理科70点の場合の平均点をターミナルに出力するプログラムを記述しましょう。
条件1:このプログラムでは各教科の点数を変数を使って定義してください。
条件2:出力結果は以下のようになるコードを書きましょう。
5教科の平均点は、◯点です。
※○の部分に点数が表示される。
以下は解答になります
解答
japanesa_score = 80
mouth_score = 85
english_score = 50
history_score = 75
science_score = 70
avarage_score = (japanese_score + mouth_score + english_score + history_score + science_score) / 5
puts "5教科の平均点は、#{avarage_score}です。"
条件1に変数を使ってとあるため、各教科を変数として定義します。また、平均点も変数に定義するのが望ましい。
最後にputsで出力をすれば完成です。
少し記述量が増えても、読みやすいコードを書くことを優先するように意識していきます。