NAiZのプログラミング道日記

個人web開発勉強で学んだことや経験を備忘録形式で呟きます。

Ruby on Rails チュートリアル 11日目(4章)

はじめに!

Ruby on Rails チュートリアルの4章が終わりました!

ところで!この間ツイッターを見ていたら、モダンweb系開発企業を就活で受けたという方が質問内容を投稿しているのを拝読しました。
前章で学んだGETとPOSTの違いって結構聞かれるのですね。他にもこれから学ぶログイン機能の実装方法なども聞かれるそうで…怖いですね。
復習も定期的にやらないと、

それと本を買いました!

f:id:ento2:20200322003101j:plain
プロを目指す人のためのRuby入門
www.amazon.co.jp

買って使ってみたところ、正直、参考書の購入は不要不急ではないと思いました。理由としましては、もともとJavaを触っていてRubyの記法を学ぶのにRailsだけで十分だと感じたことと、何より
情報量が多い。
いや、いいことなんですけど、周回するようなものではないですね。辞書用かな。初心者向けでもないですね。(そもそもプロを目指す向けって書いてあるだろ!と怒られそう)
いずれ買うことになると思ってましたし…、深くrubyの仕組みを理解する分にはとても満足できそうです。(星5)

さて、本題に入ります!!
今日も感想や、気づきを備忘録形式で載せていきます!

Ruby on Rails チュートリアル4章!

①ページタイトルとは

恥ずかしながら、ページタイトルという用語を誤解していました。
てっきりwebページの標題のことかと思いきや、ページタイトルはブラウザの上にでてくるタブに表示されるのですね。
なので、チュートリアルを読んでいて『あれ?変わんない』と暫く悩んでいました。(笑)

irbrails console

私はrailsのコンソールではなく、irbコマンドでrubyの対話型プログラミングをおこないました。
ですが、しばらく進めると、まるで私の行動を読み取ったかのように前触れもなく『irbではできないヨ』と注意書きが!
Ruby on RailsRubyフレームワークですが、書き方には少し異なる点もあるみたいですね。

③4.2.4の演習

putにしなかったので問3でfalseが出てしまいました。

>> def palindrome_tester(s)
>>   if FILL_IN
>>     puts "It's a palindrome!"
>>   else
>>     puts "It's not a palindrome."
>>   end
>> end

④クラス内におけるメゾッドの順番

4.4.5 の演習1についてです。
先に何にはまったかと言うと、以下のようなエラーが起きました。

>> example.email="user@example.com"
=> "user@example.com"
>> example.formatted_email
=> " <user@example.com>"  ➡氏名が表示されない!!
>> example.full_name 
=> "Example User" ➡氏名が格納されている!動作はしているみたい!


ちなみにソースコードは以下の通りです。

class User
 attr_accessor :first_name, :last_name, :email

 def initialize(attributes = {})
  @first_name = attributes[:first_name]
  @last_name  = attributes[:last_name]
  @email = attributes[:email]
 end

 def full_name
  @full_name = "#{@first_name} #{@last_name}"
 end

 def formatted_email
  "#{@full_name} <#{@email}>"
 end

end

結論を先に言いますと、full_nameメソッドとformatted_emailメソッドの上下を入れ替えたら正常に動きました。

どういう試行錯誤をしたかというと、
最初の実行結果では、full.nameメゾッドはしっかり値が格納され、表示されている

first、lastは直接シェルでぶち込んでいるから保存されているだけのかな?

ということは、full.name動かしている時点ではそこだけがうごいて、保存されている値が格納されるけど、formatted_emailでは、full_nameは別の宣言されたメゾットで値を格納しているがゆえに呼び出せていないのではないか?

よくわからないけど、逆にしよう。
こんな感じです(笑)

class User
 attr_accessor :first_name,:last_name, :email

 def initialize(attributes = {})
  @first_name = attributes[:first_name]
  @last_name = attributes[:last_name]
  @email = attributes[:email]
 end

 def formatted_email
  "#{@full_name} <#{@email}>"
 end

 def full_name
  @full_name = "#{@first_name} #{@last_name}"
 end

end

すると、できました。

そういえば前にpython を使ってロボット開発の勉強していた際にもこんなことがあった気がします。

つまりは、後者のソースコードならformatted_emailを呼び出した後にfull_nameが実行され、値が格納されてからformatted_emailが実行される
または、ソースコードの後ろから実行されていく可能性があるみたい。

まとめ

うーん
最後のメソッドの順番は難しかったですね。オブジェクト指向もちょっと怪しかったですし、4章でこけてて大丈夫なのか?と不安になりました。
次は5章です!
まあ、完璧主義はwebエンジニアにはあまり向かないと云いますし、とりあえず先に進もうと思います!
もちろん復習もしっかりしますが…(笑)