読書メモ: Railsの教科書

下記の本を読んだため備忘を投稿する。

tatsu-zine.com

----------

第2章 一番小さな Rails アプリづくり

  • rails s コマンドは web サーバを起動するコマンドで、s は server の略

  • Routes はリクエストの URL と HTTP メソッドから Controller のアクションを決定するため、リクエストとControllerのアクションの対応表と言える

  • Routesは画面から確認可能だが、Controller#Actionに"hello#index" と書かれている場合、#の左側がコントローラ名、右側がアクション名です。この場合は、「HelloController の index アクション」を示している

  • ビューやコントローラで使い回す変数はローカル変数ではなくインスタンス変数を使う

  • ビューのファイルである index.html.erb はHTMLの元になるファイルだが、普通の HTML との違いとして、Ruby のコードを実行した結果を埋め込むことも可能。このようなファイルをテンプレー トと呼ぶ。ここでは erb という種類のテンプレートが使われている。

  • 環境構築時Railsのインストールで詰まったが下記で解決した

    https://k-koh.hatenablog.com/entry/2020/01/21/120142

第3章 CRUD の基礎と index アクション

rails g scaffold コマンドは新規作成、表示、更新、削除、各機能を一度に作る機能です。つまり、scaffold を使うとCRUD 機能を持ったページを作成することができます。

rails g scaffold book title:string memo:text

コントローラのアクションでの処理が終わると、次はビューで処理が移ります。特に指定がないときは、app/views/コントローラ名/アクション名の view ファイルへ処理が移ります。例えばコントローラがbooks#indexの場合は app/views/books/index.html.erb です。

<%= %>で囲まれた部分は、Ruby コードの実行結果が HTML として埋め込まれま す。類似の部品<% %>では、囲まれた Ruby コードは実行されますが結果を埋め込みません。今回は@books.each の繰り返しの指示で <% %> が使われています。

第4章 new, create アクション

  • Railsでは次の順に処理が進んでいく

    リクエスト(URL, HTTPメソッド)

    Rails App(Routes→Controller→View)

    →レスポンス(HTML)

  • ビューのコード views/books/new.html.erbでは下記の書式になっている

    <%= render 埋め込むパーシャルビューファイル名, パーシャル内で使う変数名: 渡すオブジェクト %>
    

    パーシャルであるビューファイルの名前は先頭に_を付けるルールがあるので、パーシャルは render で書いた「埋め込みたいパーシャルビューファイル名」文字列の先頭に_を付けたファイル 名にします。つまり、<%= render "form", book: @book %>で埋め込まれるファイルは _form.html.erb になります。

  • Chromeデベロッパーツールでリクエストヘッダとパラメータを観察することができる。リクエストを送信するタイミングで、Networkタブの当該リソース(例えばbooks)のHeadersにURLとメソッドが記載されている。Payloadにパラメータ(画面での入力内容)が記載されている。

  • Strong Parametersというセキュリティの仕組みがあり、パラメータの内容を制限することができる。

    def book_params
          params.require(:book).permit(:title, :memo)
    end
    

    params 以降の require, permit メソッドは、パラメータの内容を制限します。意図していない データが入ってくるのを防ぐための仕組みです。ここでは、book の title, memo だけを受け取るようにしています。require には対象となるモデル名(モデルについては次章で説明します)を、 permit には更新を許可するカラム名を指定します。

第5章 モデル

  • 作成されたモデル(app/models/book.rb)ではコードがほとんど記載されていないにも関わらずsaveやallといったメソッドが使える理由は、ApplicationRecordクラス(およびさらに親のクラス)を継承しているから。 ApplicationRecordクラスがtitleやmemoといった要素(カラム)があることはDBを通じて知っている

  • Railsでのインスタンス変数の寿命は次のように考えればよい

    Rails の場合、@book のようなコントローラのアクションで代入したインスタンス変数は、1 つのリクエスト内が有効範囲だと考えることができます。おおまかには、あるページをブ ラウザで表示することが 1 回のリクエストだと考えて差し支えありません。別のページを表示したり、リロードを行ったりすると、新しい別のリクエストになります。コントローラのアクションで インスタンス変数に代入すると、コントローラからビューまで使うことができますが、その後なくなります。

モデルの作り方

  • scaffold は DB 設計書(migration)を作るコマンド。

    rails g scaffold book title:string memo: text

    生成されるファイル:

    app/models/book.rb (モデルファイル)

    db/migrate/日付_create_books.rb (migrationファイル)

  • DB設計書(migrationファイル)からDBのテーブルをつくるのがrails db:migrate コマンド。

    このコマンドを実行すると/db/migrate フォルダにあるマイグレーションファイルを 実行して DB テーブルを作る。

モデルの使い方

book = Book.new(title: "RubyとRailsの学習ガイド",
memo: "Rails関連技術地図とそれらの学習資料の紹介")

Book.new で Book モデルオブジェクトを作ります。モデル名は大文字はじまりで、単数形にするルールがあります。引数で title、memo といった各カラムのデータを渡せます。

book.save

save メソッドを呼ぶと保存できます。成功すると true を、失敗すると false を返します。

books = Book.all.to_a

Book.all で DB に保存されている Book Model の全データを取得できます。Book.all.to_a を実行すると、Array に Book オブジェクトが詰まって返ってきます。

book = Book.where(title: "RubyとRailsの学習ガイド").first
book.title #=> "RubyとRailsの学習ガイド"
book.memo #=> "Rails関連技術地図とそれらの学習資料の紹介"

where メソッドを使うと検索ができます。タイトルが"RubyRails の学習ガイド"である Book オブジェクトを取得します。取得した Book オブジェクトは、title メソッドでタイトルを、memo メソッドでメモを返します。

  • 既存のDB テーブルにカラムを増やすには、下記コマンドで追加可能(その後rails db:migrate コマンドで DB へ内容を反映する必要有り)

    rails g migration Addカラム名Toテーブル名 カラム名:型名

rails g コマンドまとめ

  • rails g migration: migration

    rails g migration AddAuthorToBooks author:string

  • rails g model: model + migration

    rails g model book title:string memo:text

  • rails g controller: routes + controller + view

    rails g controller books index

  • rails g scaffold: model + migration + routes + controller + view

    rails g scaffold book title:string memo:text

既存のテーブルにカラムを追加して画面から入力できるように変更する

  • 追加のmigrationの作成、migrationからDBの作成に加えて、下記を修正する必要がある
    • フォームパーシャルビューファイルを修正app/views/books/_form.html.erb にフォームラベルとテキストフィールドを追加する

    • 詳細表示画面のビューファイルを修正

      app/views/books/_book.html.erb に追加したフィールドを表示するよう要素を追加する

    • controller を修正

      app/controllers/books_controller.rb のStrongParametersに追加したフィールドを追加する

第6章 Gem ライブラリ

  • Bundler では Gemfile という名前のファイルに使用する Gem を書く
  • Gemfile を作成し bundle installコマンドを実行すると、Gem 群がインストールされる
  • bundle install コマンドを実行すると Gemfile をもとに Gemfile.lockファイルが生成されるので、両方をソース管理対象にする
  • Gemfile は発注書、Gemfile.lock は納品書に相当する

第7章 画像アップロード機能の追加

  • carrierwave gem を使うと画像アップロード機能を追加できる
  • Gemfile に新しい gem を追加した後、bundle install コマンドでインストールする