今月一番のアハ体験。理解が繋がっていく楽しさ。
今日3度寝した人。はい、私です。
寒くなってきた影響か、朝に弱くなってきました。
まずは、前回の記事の答え合わせから。
結論:==の使い方を間違えた。
==は変数や配列には使えないというのが答え。
あくまで”左右の文字列が一致しているか”をジャッジする。
name = "yuki"
name == "yuki"
としても、等号比較メソッド==さんは、
「左にあるやつ文字列でない上に、同じ表記でもないやんけ」
と判断し、結果をfalseと返す訳ですね。
勉強になりました。==さんありがとう。
さて、気分的に11月導入される
「とある魔術の禁書目録」のパチンコ台スペックでも見ながら雑談しよう。
と思ってたんですが・・・
タイトル回収。
プログラミングで今月で1番のアハ体験をしたので、それについて書きます。
まずは、下図を。
このコードを見て私が疑問に思ったことは3つ。
①createアクションでインスタンス変数が3つ生成されているが、これはなぜ?
※見えませんがviewへの出張先はなかったので、インスタンス変数にする必要はないのでは?と思っていました。
②@room.messsage.newは、Message.newではダメ?
③redirect_toに引数(@room)はなぜ?
これらを疑問に思ったのですが、蓋を開けてみると・・
「なるほど。確かにこうなるわ。」
という訳で順番に解説をしていこうと思います!
①結論:redirect_toとrenderがあるから。
・redirect_toはroom_message_pathへ
・renderはindexアクションを介さず、indexページへ
これらはコントローラーから飛び出して外の世界へ外出してます。
外出するならローカル変数ではなくインスタンス変数になる。スッキリ。
さらにもう1つ言っておくと、indexアクションを介さずindexページへ行く訳なので、
indexアクションで定義された変数以外を持っていったら、
indexページさんはそれ何?となります。
なので、持っていく@messagesは同じ定義文となっている訳ですね。
②結論:ダメ。
Message.newだと「どのroomに対してのmessageなのか」がわかりません。
なので、@room(さっき定義したroom)をつけてあげましょう。
ちなみにこの書き方はアソシエーションしているから為せる技。
③結論:保存後の情報に更新するため。
ここでは、保存に成功した時のページ遷移を決定しているのですが、@roomをつけないと保存した文が表示されずわかりにくくなる。
なので、区切りをつける意味でも新しくインスタンス変数を生成すると無事表示される。
長々となりましたが、こんな感じです。
間違っていたら申し訳無い。
理解するのに、時間はかかりましたが楽しかった。
プログラミングの醍醐味ってこういうところなのかなと思います。
では、おやすみ(つ∀-)オヤスミー