[Day4 Rails Tutorial]第四章完|今日はRubyチュートリアルな感じ[4.1.〜4.5]

Rails Tutorial day1 感想 まとめ 振り返り エラー解決 演習問題 回答

早いものでDay4。

三日坊主を乗り越えた!

今日もはりきっていきましょー!

読んでいただいている方、いつもありがとうございます!

初心者なもので、たまに間違った内容もあるかと思います。

その際にはコメントやTwitterでご指摘いただけると幸いです!

 

[Day4]第四章4.1〜作業ログ

カスタムヘルパーを活用してコードを簡単に

app/helpers/application_helper.rb を使った。

helpersはまだよくわかんないな。

viewsを返すときに、自動的にhelpersも経由しているのかな?

 

Rails Consoleは

  • development (開発) 環境
  • test (テスト) 環境
  • production (本番) 環境

の内、デフォルトではdevelopment環境で起動するらしい。

 

print,puts,pの違いは?

今回はrubyの基礎のお勉強のようです。

  • print #改行なし
  • puts #改行あり(末尾に\nを自動的に付加)
  • p #データ形式がわかる(デバック用)
    p は puts ST.inspectと等価

※ST:something

 

シングルとダブルクォートの違いは?

  • シングルクォート:式展開できない
  • ダブルクォート:式展開できる

‘#{foo} bar’
→ “\#{foo} bar”

逆に言えば、ダブルクォートないで#を使いたいときは、\をつけてあげればいい。

このバックスラッシュ\でいろいろエスケープできるみたい。

ちなみにoption + ¥ で \ 打てる。

 

nilは特別|扱いには注意

nil.empty?
→NoMethodError: undefined method `empty?’ for nil:NilClass

nil.nil?
→true

nil.to_s.empty?
→true

※.to_s は文字列(String)に変換するメソッド。

メソッドを続けることもできて、メソッドチェーンという。(カッコイイ)

 

Railsではヘルパーモジュールは自動的に読み込んでくれる

module ApplicationHelperという要素について解説します。モジュールは、関連したメソッドをまとめる方法の1つで、includeメソッドを使ってモジュールを読み込むことができます (ミックスイン (mixed in) とも呼びます)。

なろほど。

単なるRubyのコードを書くのであれば、モジュールを作成するたびに明示的に読み込んで使うのが普通ですが、Railsでは自動的にヘルパーモジュールを読み込んでくれるので、include行をわざわざ書く必要がありません。

ちょっと前で書いた、「自動的にhelpersも経由しているのかな?」の謎が解けた。

自動的に読み込んでくれるから、viewsでも使えたんだね。

でも次の疑問が湧いてきた。「なんでhelpersでメソッドを定義したか」

Progateでは、modelsに書いたメソッドを呼び出したりしてたから、その違いってなんだろうな。

 

破壊的メソッドには ! がつく

配列の内容を変更したい場合は、そのメソッドに対応する「破壊的」メソッドを使います。

たとえば、a = [42, 8, 17] に対して、

a.sort
→ [8, 17, 42]

だけど、もともとのa配列は変わっていない。

一方で、

a.sort!
→ [8, 17, 42]

とすると、その変更が保存されて、

a
→ [8, 17, 42]

となる。

 

Rubyでは異なる型が配列の中で共存できる

他の多くの言語の配列と異なり、Rubyでは異なる型が配列の中で共存できます (上の場合は整数と文字列)。

これはびっくり。

 

知らず知らずのうちにクラスを使ってオブジェクトを作成していた!?

  • s = “foobar”
  • s = String.new(“foobar”)

は同じ。また、

  • a = [1, 3, 2]
  • a = Array.new([1, 3, 2])

 

 

メモ

登場したメソッドをいろいろまとめ

  • .empty?
  • .nil?
  • .include?(“ST”) ※something
  • .to_s
  • .to_i
  • .to_a
  • .split
  • .split(“ST”)
  • .join
  • .join(“ST”)
  • .first
  • .second
  • .last
  • .length
  • .sort
  • .reverse
  • .shuffle
  • %w[foo bar baz quux]
  • .downcase
  • .inspect

 

シンボル表記について

これらはすべて等価。

  • { “name”=>”Michael Hartl” }
  • { :name => “Michael Hartl” }
  • { name: “Michael Hartl” }

 

さいごでつまずいた|requireできない?

演習で、自分でClassを作成する問題がありました。

具体的にはここです。

Userクラスで定義されているname属性を修正して、first_name属性とlast_name属性に分割してみましょう。他。

はじめのrequire './example_user' もうまく行って、ここまでは順調に来ていました。

しかし、この演習でファイルを変更しても変更が反映されませんでした。

再度require './example_user' してみるも、結果はfalse。

ファイルを作り直したり格闘したのですが、また2度めのrequireがfalseに。

諦めることにしました!

 

これにて第四章終了です!

今日はRailsというより、ほとんどがRubyの講義でしたね。

「deified」という単語は回文である

がお茶目で面白かったです(笑)

 

タケシなりの演習の回答

city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。他。

>> city = "tokyo"
=> "tokyo"
>> pref = "shinjuku"
=> "shinjuku"
>> puts "#{city} \t #{pref}"
tokyo    shinjuku
=> nil
>> puts '#{city} \t #{pref}'
#{city} \t #{pref}
=> nil

 

文字列 “A man, a plan, a canal, Panama” を “, ” で分割して配列にし、変数aに代入してみてください。他。

>> a = "A man, a plan, a canal, Panama".split(",")
=> ["A man", " a plan", " a canal", " Panama"]
>> s = a.join
=> "A man a plan a canal Panama"
>> s.split(" ").join
=> "AmanaplanacanalPanama"
>> palindrome_tester(s.split(" ").join)
It's not a palindrome.
>> palindrome_tester(s.split(" ").join.downcase)
It's a palindrome!

 

aからzまでの範囲オブジェクトを作成し、7番目の要素を取り出してみてください。同様にして、後ろから7番目の要素を取り出してみてください

>> array = ("a".."z").to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
>> array
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
>> array.seventh
NoMethodError: undefined method `seventh' for #<Array:0x00000001e3a480>
        from (irb):108
>> array[6]
=> "g"
>> array[array.length-7]
=> "t"

 

yeller (大声で叫ぶ) というメソッドを定義してください。このメソッドは、文字列の要素で構成された配列を受け取り、各要素を連結した後、大文字にして結果を返します。

>> def yeller(a)
>> puts a.join.upcase
>> end
=> :yeller
>> yeller(["o", "l", "d"])
OLD

 

random_subdomainというメソッドを定義してください。このメソッドはランダムな8文字を生成し、文字列として返します。

>> def randomsubdomain
>> puts ("a".."z").to_a.shuffle[0..7].join
>> end

 

リスト 4.12の「?」の部分を、それぞれ適切なメソッドに置き換えてみてください。

>> def string_shuffle(s)
>> s.split("").shuffle.join
>> end
=> :string_shuffle
>> string_shuffle("foobar")
=> "ooafbr"

 

キーが’one’、’two’、’three’となっていて、それぞれの値が’uno’、’dos’、’tres’となっているハッシュを作ってみてください。

>> number = {}
=> {}
>> number[:one] = "uno"
=> "uno"
>> number[:two] = "dos"
=> "dos"
>> number[:three] = "tres"
=> "tres"
>> number
=> {:one=>"uno", :two=>"dos", :three=>"tres"}
>> number.each do |key, value|
?> puts "’#{key}’のスペイン語は’#{value}’"
>> end
’one’のスペイン語は’uno’
’two’のスペイン語は’dos’
’three’のスペイン語は’tres’
=> {:one=>"uno", :two=>"dos", :three=>"tres"}

 

person1、person2、person3という3つのハッシュを作成し、それぞれのハッシュに:firstと:lastキーを追加し、適当な値 (名前など) を入力してください。その後、次のようなparamsというハッシュのハッシュを作ってみてください。

>> person1 = {first: "an", second: "bin"}
=> {:first=>"an", :second=>"bin"}
>> person2 = {first: "can", second: "don"}                                                       
=> {:first=>"can", :second=>"don"}
>> person3 = {first: "en", second: "fan"}                                                       
=> {:first=>"en", :second=>"fan"}
>> params = {}
=> {}
>> params[:father] = person1
=> {:first=>"an", :second=>"bin"}
>> params[:mother] = person2
=> {:first=>"can", :second=>"don"}
>> params[:son] = person3
=> {:first=>"en", :second=>"fan"}
>> params[:mother][:second] == person2[:second]
=> true

 

今度はRangeクラスとnewメソッドを使って、1から10の範囲オブジェクトを作ってみてください。他。

>> range1 = Range.new(0,10)
=> 0..10
>> (0..10) == range1
=> true

 

リスト 4.16を参考に、Stringクラスにshuffleメソッドを追加してみてください。ヒント: リスト 4.12も参考になります。

>> class String
>> def shuffle
>> self.split("").shuffle.join
>> end
>> end
=> :shuffle
>> "foobar".shuffle
=> "ofaorb"

 

[Day4]まとめ

  • 学習範囲:4.1〜4.5
  • 学習時間:5時間
  • 総学習時間:19時間50分
  • 反省点:今日は演習問題が多くて多くて、大変でした。ちゃんと全部やったぞ!
  • 備考:最後の演習問題ちょっとできなかった。

読んでいただいている方、いつもありがとうございます!

初心者なもので、たまに間違った内容もあるかと思います。

その際にはコメントやTwitterでご指摘いただけると幸いです!

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です