背景
1周目第13章途中でどうしても問題が解消できなくなり、gitでソースコードを戻してもDBの状態が戻らない、Herokuにデプロイはできるがアプリケーションが表示されない等の問題達にぶち当たったため、意図せず2周目を開始することに。
今回は丁寧にわからない用語等あれば拾いつつ復習していこうと思います。
第4章 Rails風味のRuby
本章ではRailsというよりRubyそのものの機能や概念・実装方法についての知識を学びました。メソッドやクラスはもとより配列・範囲・ハッシュ等の様々なRubyの機能を実装しつつ手に入れていきました。
また、その中で「クラスが継承される」ことに着目し、どのクラスは何クラスから継承しているのかを探るといった演習も行いました。
この章では今後のRuby on Railsでの開発のため、Ruby自体のAPIや機能を学ぶことを通じてサンプルアプリケーションの実装を行いました。
以下1周目はスルーしていた概念やコマンドの意味を調べる
カスタムヘルパー
Railsに元々存在している組み込み関数のことを「ヘルパー」と言いますが、一方でそうでないものを「カスタムヘルパー」というようです。
Rails Tutorial 第4章 Rails風味のRubyより引用
- Railsのビューでは膨大な数の組み込み関数が使えますが、それだけでなく、新しく作成することもできます。新しく作ったメソッドはカスタムヘルパーと呼ばれます。
【結論】
- Ruby on Railsでは組み込み関数は「ヘルパー」、作られた関数は「カスタムヘルパー」という
メソッドチェーン
メソッドは複数つなげて利用することができます。そういう動作や手法のことを「メソッドチェーン」とよぶようです。競技プログラミング等ではよく使うためこの手法は知っていましたが名前は初めて知ったため忘備録として残しておきます。
# 競技プログラミングでよく使う標準入力を配列化し、それを数値として扱うメソッドチェーン
> 3 4 5
$ line = gets.split(' ').map(&:to_i)
>> [3, 4, 5]
# 文字列a~zの範囲を配列化してその順序をシャッフルするメソッドチェーン
$ ('a'..'z').to_a.shuffle
>> ["q", "u", "r", "x", "w", "b", "a", "l", "n", "t", "j", "d", "v", "o", "g", "m", "z", "k", "h", "s", "f", "p", "i", "c", "y", "e"]
【結論】
- メソッドは複数繋げて、「メソッドチェーン」にすることができる
- 便利かつ簡潔に書けるので有用な一方、可読性が下がるように思うのではじめは少しつづ理解して使っていきたい
範囲の.の数による動作の違い(a..z, a...zの違い)
これはRails Tutorial内にはなかったものですが、の「4.5 範囲(Range)」(115p)に記載があったのでここに残します。
最初値..最後の値(最後の値を含む)
$ a..z (a~z)最初値...最後の値(最後の値を含まない)
$ a...z (a~y)
これは細かい差ですが、理解を間違い使ってしまうとバグの温床になるので気をつけたいと思います。
ハッシュ
他のプログラミング言語(PHP等)では「連想配列」と呼ぶ概念です。
配列内にKeyとValueが設定されており、Kayを呼び出すとValueが表示できます。
以下、[Rails Tutorial 第4章 Rails風味のRuby](https://railstutorial.jp/chapters/rails_flavored_ruby?version=6.0#sec-custom_helpers)より引用
# ハッシュのリテラル表記
>> user
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}
# キーが "first_name" で値が "Michael"
>> user["first_name"] = "Michael"
=> "Michael"
# キーが "last_name" で値が "Hartl"
>> user["last_name"] = "Hartl"
=> "Hartl"
【結論】
ハッシュ中のハッシュを作成する場面で最初に空のハッシュを作り忘れた
以下のようにハッシュの中にハッシュを作成する場合は、はじめに空のハッシュを作成しておく必要があります。
でないと、以降上位のハッシュを呼び出す際に「TypeError (no implicit conversion of Symbol into Integer)」というエラーが出ます。気をつけましょう。
>> params = {}
=> {}
>> person1 = {first:"Hiro", last:"Shima"}
=> {:first=>"Hiro", :last=>"Shima"}
>> person2 = {father:"Miyuki", last:"Shima"}
=> {:father=>"Miyuki", :last=>"Shima"}
>> person3 = {father:"Ichi", last:"Shima"}
=> {:father=>"Ichi", :last=>"Shima"}
>> params[:father] = person1
=> {:first=>"Hiro", :last=>"Shima"}
>> params[:father][:first]
=> "Hiro"
>> person1[:first]
=> "Hiro"
【結論】
- これは凡ミス。ハッシュの中にハッシュを入れるなら親を空でも良いので定義しておかないといけなかった。
- とはいえ、これがInteger系のエラーになるとは思わなかった。