なんとか13章まで終わらせることができたので、いつものようにブログを書いていきたいと思います。
リスト13.31に次のようなコードがあります。
post microposts_path, params: { micropost: { content: "Lorem ipsum" } }
最初、どうしてここにparamsが必要なのかよく分かりませんでした。
これは単純にparamsの使い方を忘れていただけです。
paramsとは、「クライアントからURLやフォームで送信された値(パラメータ)を取得するメソッド」のことです。
そして、micropostとして送信されるものは、フォームで送信されるものでもあります。
つまり「Lorem ispumという文章をmicropostとしてフォームから送信し、それをparamsによって取得して、micropost_path宛てへとpostする」ということです。
次はリスト13.40の下にある
<%= render 'shared/error_messages', object: f.object %>
についてです。
このobject: f.objectが一体何なのか、最初見たときうまく理解できませんでした。
このコードを理解するためには、リスト13.41とリスト7.21を比較する必要があります。
リスト7.21においては、@userを使うことによって、Userオブジェクトに関するフォームを送信するとき(ユーザーを登録するときなど)に、エラーメッセージを表示させていました。
しかし、このパーシャルを書き換えて、リスト13.41のようにすることによって、Userオブジェクトだけじゃなくて、Micropostオブジェクトにも使えるようになります。
このことによって、一つのパーシャルを書くだけで、様々な場所で再活用できるようになります。汎用性が高くなり、コードを書く量が減る(コードをまとめられる)というわけです。
リスト13.48です。
これはステータスフィードのパーシャルと書かれていますが、どうしてこのようなパーシャルを書くと、図13.14のような画像になるのか、いまひとつ理解できませんでした。
この仕組を理解するためには、さかのぼってリスト13.22から13.24あたりまでの仕組みを理解する必要があります。
リスト13.24におけるハイライト部分に対応しているのが、リスト13.48です。
リスト13.24においては、少し下にある図13.7のように、投稿をズラッと並べることを目的にしています。
このハイライトの中にある
<ol class="microposts"> <%= render @microposts %> </ol>
によって、リスト13.22とリスト13.23が呼び出されて、投稿をズラッと並べられるようになります。
どうしてこれでズラッと並べられるかと言うと、リスト13.22の上に説明されているように、リスト10.52と同様のリファクタリングをおこなっているからです(<% @microposts.each do |micropost| %>のようなものを省略できているということです)。
さて、リスト13.22の仕組みを理解したところで、リスト13.48に移ります。
ここでは<%= render @feed_items %>を使っているわけですが、リスト13.46でfeedとしてmicropostsが与えられており、なおかつリスト13.47でインスタント変数に代入されているので、リスト13.48が問題なく実行されるというわけです。
そして、リスト13.49によって、そのリスト13.48のパーシャルが読み込まれます。ややこしいですね。
構造的には
リスト13.49の<%= render 'shared/feed' %>
→リスト13.48の <ol class="microposts"><%= render @feed_items %>
→リスト13.22のパーシャル
の順番で読み込まれていくわけです。
なぜ、そのままmicropostで表示させるのではなく、わざわざわこの「feed」というメソッドを作って、そのfeedメソッドを経由して表示させているのか?
①Homeページへと簡単に表示させるため
②feedメソッドに14章で拡張性を持たせるため
の二つの理由があります。
この①の理由を詳しく説明すると、この13章の前半で学んだように、micropostを表示させるためには色々な設定が必要です。それを再びもう一度最初から組み直すのは面倒で、手間が掛かってしまいます。
その手間を無くすため、feedメソッドを使っているわけですね。
リスト13.51にこんなコードがあります。
<% if current_user?(micropost.user) %>
このクエスチョンマークって何だっけ?とド忘れしていたのですが、これは単純に真偽値を求めるために使われています。rubyの.html.erbにおけるクエスチョンマークは真偽値を求めるものである、と覚えておく必要があります。
あと、地味に引っかかったポイントなのですが、リスト13.63(演習2)にこのような文章があります。
これ、最初見たとき、「cpってことはコピーで合ってるよね? でもいったい何をどこにコピーしているんだ?? コードが1つしかないぞ???」と困惑してしましました。
答えは簡単で「app/assets/images/rails.png」と「test/fixtures/」の間に、半角スペースが空いていたのです!
いや、こんなところで引っ掛かるわけないだろ、ってツッコまれそうですが、この半角スペースがとても見えづらくて、気づくまでに時間が掛かりました。
テキストエディタ上であれば、こうした半角スペースをわかりやすく表示させる機能があるのですが、ただテキストだけをドンと置かれると、繋がっているのか繋がっていないのか分かりにくいです。たぶんこうした見落としが、意図しないバグの発生を引き起こしてしまうのでしょう……と自分の未来予測。みなさんも注意しましょう。
リスト13.63です。
ここに
assert_select 'input[type=(コードを書き込む)]'
というコードがあって、この答えは、
assert_select 'input[type="file"]'
となるのですが、いったいこれは何をしているのかというと、リスト13.60の
<%= f.file_field :picture %>
を確認してる(はずです)。
「assert_select 'input[type="file"]'」とは、単純に「ここにファイルをinputできるボタンがあるよ」ということを確認しています。
だから、実際に図13.20のような画面を表示させてみて、それを参照にテストを書けば良いというわけですね。
テキストだけ見ていてもうまくイメージできないときは、railsを動かしてみて、その画面を表示させてみると視覚的に何をテストすれば良いのかが分かりやすくなると思います。
だいぶ遡るのですが、リスト13.17に無名関数、lambda、アロー関数が出てきます。
この無名関数とは、callメソッドで呼び出されたときに発動するらしいです。
でも、どうしてこのdefault scopeでこの無名関数が使われているのか、いまひとつわかりませんでした。
おそらくtestをされることによって、それがcallとしての機能を果たすため、default_scope -> { order(created_at: :desc) }が実行されるのだと思いますが、ちょっとよく分かりませんでした。あとで調べてみようと思います。
最後に、今回の章で参考にさせていただいたサイト集をまとめていきたいと思います。
本文中では書かなかったものの、やや詰まった箇所のリンクも貼ってあります。
順不同です。
自分は分からないものや忘れたものをその都度調べて定着させていくタイプなので、過去のものと被っているものもあるかもしれません。
こうしてリンクを並べることで、自分の振り返りノートにしている側面もあります。自分が調べたものの軌跡を後で振り返られるのは、色々な面でメリットが有ると思っています。
(ブックマーク、というかタブを整理できるので……)
Railsのdefault_scopeは使うな、絶対(翻訳)|TechRacho by BPS株式会社
https://techracho.bpsinc.jp/hachi8833/2021_11_04/47302
【Rails】環境の指定と作成方法について(Rails.env) - TASK NOTES
https://www.task-notes.com/entry/20160920/1474343389
355 拡張子の「~.jpeg」と「~.jpg」の違いは?
https://job.fellow-s.co.jp/useful_info/feature_detail/Art-0510
【Rails】errors.addって何? - Qiita
https://qiita.com/yujiG/items/3e34e2e0e7b4120b0584
Rails 超お手軽な画像アップローダー CarrierWave の使い方 | Workabroad.jp
https://workabroad.jp/tech/1118
【Ruby】メソッド名や関数名の末尾の!(ビックリマーク)と?(はてなマーク)の意味とは?。実例で解説。 - Qiita
https://qiita.com/shizen-shin/items/91bdb90dabcb35310d7f
チュートリアル13章 - mmm_stの日記
https://mmm-st.hatenablog.com/entry/2021/01/26/101811
<%= render @hogehoges %>でなぜ/hogehoges/_hogehoge.html.erbを使ってくれるのか - Qiita
https://qiita.com/kitsunecat/items/f1f867ba497ac6d981eb
whereメソッドについて(rails) - Qiita
https://qiita.com/kaito121855/items/3d49d8478b4fe1ac99f4
RailsのStrong Parametersを調べる - Qiita
https://qiita.com/mochio/items/45b9172a50a6ebb0bee0
<input type="file"> - HTML: HyperText Markup Language | MDN
https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/file
【Rails】paramsってなんだ? - Qiita
https://qiita.com/sleepy_cat/items/c8eecfc5c486b0f7f2b8
【Rails】 paramsって一体何?使い方を徹底解説! | Pikawaka
https://pikawaka.com/rails/params
Ruby on Rails チュートリアルで30歳までに人生を変える(第10章) - おぴよの気まぐれ日記
https://opiyotan.hatenablog.com/entry/railstutorial10
Railsのテストでresponse.bodyは何を見ているのでしょうか
https://teratail.com/questions/365462
Rails Tutorial 第13章 簡易まとめ - Qiita
https://qiita.com/krppppp/items/813c40dacc6f6928d9dd
【Rails】パーシャルを利用する - Qiita
https://qiita.com/d0ne1s/items/154a5faa5ae09466e637
liタグとは|コーディングのプロが作るHTMLタグ辞典
https://html-coding.co.jp/annex/dictionary/html/li/
[Rails]seedファイル使い方 - Qiita
https://qiita.com/nakachan1994/items/433d663375309fadea4d
Railsのvalidatesとは?事例付き解説でvalidatesを徹底理解|Udemy メディア
https://udemy.benesse.co.jp/development/system/validates.html
Railsにおけるモデルについて - Qiita
https://qiita.com/okamoto_ryo/items/f6be7ecc5cf5988c5773
【Rails】モデルの関連付けで用いられるbuildメソッドまとめ|TechTechMedia
https://techtechmedia.com/build-method-rails/
【Rails】buildメソッドについて|Rubinistを目指す新米エンジニアのTECH BLOG
https://sakaishun.com/2021/03/19/build-method/
【 cp 】コマンド――ファイルをコピーする:Linux基本コマンドTips(17) - @IT
https://atmarkit.itmedia.co.jp/ait/articles/1605/31/news019.html
railsチュートリアル魔改造編 第23章 ホーム画面魔改造|俺様|note
https://note.com/el93019205/n/n5e08c2382dd9
Rubyのシンボルを丁寧に理解する
https://zenn.dev/kanoe/articles/352d78902c83e168db66
Rubyのイテレータ - Rubyで配列をもっと簡単に使えるためイテレータの使い方を説明します。
https://dev-yakuza.posstree.com/ruby/iterator/
Rails Modelのscopeとlambda - Qiita
https://qiita.com/shizuma/items/fe695fe8a07aee031f01
アロー演算子の書式比較 - Qiita
https://qiita.com/sudahiroshi/items/c51618dec0f56a54670e
Railsチュートリアル 第14章 返信機能実装記録 - Qiita
https://qiita.com/johnslith/items/8d931b66f72c97c78199
Railsを読み、Goを書く。大規模SaaSのマイクロサービス化の(生々しい)実際をマネーフォワードに聞いてきた! - TechFeed
https://techfeed.io/entries/603c9ff7660450693f259950
らくだ🐫にもできるRailsチュートリアル|13.1 | らくだ🐫のさいと
https://rakuda3desu.net/rakudas-rails-tutorial13-1/
【第13章】Ruby on Rails チュートリアル 5.0(第4版)演習と解答まとめ - 新米パパの育児留学
https://mochikichi.hatenablog.com/entry/2017/03/18/085107
Ruby on Rails チュートリアル 第13章 メモ&演習 モデルの関連付け マイクロポストの表示 画像投稿機能の実装 - Qiita
https://qiita.com/bitcoinjpnnet/items/bd51658712345807c741#_reference-bc53f5a02beec782ec14