読書メモ: Railsの教科書
下記の本を読んだため備忘を投稿する。
----------
第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のインストールで詰まったが下記で解決した
第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 メソッドを使うと検索ができます。タイトルが"Ruby と Rails の学習ガイド"である 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 コマンドでインストールする