Rails チュートリアル読んでみた
概要
Rails チュートリアル(第1〜5章)を読んだ時に取ったメモです。第1章 ゼロからデプロイまで
- アプリケーションに新しいアクションを導入
コントローラー(app/controllers/*_controller.rb)に新しい関数を記述。
class *Controller < ActionController::Base def hello render html: "¡hola, mundo!" end end
ルーティングファイル(config/routes.rb)に新しいルート(URL)を記述。
Rails.application.routes.draw do root '*#hello' # root = ‘http://www.example.com‘ + ‘/’ end
- GitHubとBitbucketの相違点
- GitHub:リポジトリを一般公開する場合は無料、公開しない場合は有料
- Bitbucket:共同作業者が一定数以下ならリポジトリを公開しなくても無料(公開しない場合でも無料)、共同作業者が一定数を超えると有料(公開・非公開関係なく有料)
- 公開鍵と秘密鍵の使用方法
ターミナルから以下のコマンドを入力。
% ssh-keygen
~/.ssh
内に *.pub(公開鍵)と * があるか確認。- 使いたいサービスに *.pub (公開鍵)の中身を記載(サービス毎に記載する場所があるはず)。
- .md
はMarkdownの拡張子
- Herokuではsqlite3をサポートしていないので、RailsのデフォルトのGemfileの9行目 gem 'sqlite3'
をコメントアウト1
- rakeコマンド(rubyのビルドツール)を動かすには bootsnap
が必要なので、Gemfileに記述(デフォルトで記述されているのでコメントアウト不要)
第2章 Toyアプリケーション
- モデル名とテーブル名の規則
- テーブル名 : 複数形の名詞。コード内で使う時はスネークケースで使い、特定の場合(例. モデル内で
blongs_to
の後ろに書く場合)によって単数形を使ったりする。 - モデル名 : テーブル名の単数形。コード内とコマンドで使う時はキャメルケース、ファイル名に用いる時はスネークケースをそれぞれ使う。
- テーブルに新しいレコードを挿入する際の制限をvalidationで設ける場合、app/models/テーブルのモデル名.rb
に validates :カラム名, validation名: {オプション} ...
を記入
- 2つのテーブル(A, B)にリレーション関係(1対多)を構築
テーブルAのモデル(app/models/Aのモデル名.rb)にテーブルBとの関係(has_many)を記述。
class Aのモデル名 < ApplicationRecord has_many :テーブルBの複数形 end
テーブルB2のモデル(app/models/Bのモデル名.rb)にテーブルAとの関係(belongs_to)を記述。
class Bのモデル名 < ApplicationRecord belongs_to :テーブルAの単数形 end
ちなみに has_many: テーブルBの複数形
の後ろに , dependent: :destroy
オプションを付けると、テーブルAのレコードを削除した時、そのレコードに紐付けられているテーブルBのレコードも一緒に削除される仕様を付け加える事が出来る。
- テーブルAのレコードオブジェクト.モデルBの複数形_ids
: レコードオブジェクトに紐付いたテーブルBのレコードのidを全て含めた配列を取得(並び順は昇順)。
- テーブルのモデル(app/models/*.rb)は ActiveRecord::Base
、コントローラーは ActionController::Base
をそれぞれ継承している(基にしている)3
- app/controller/application_controller.rbに書かれている protect_from_forgery with: :exception
はCSRF対策4
第3章 ほぼ静的なページの作成
- コントローラーを作成するためのコマンド
% rails generate controller コントローラー名(キャメルケースの複数形) ページ(コントローラーに含むアクション)名 ページ名2 ...
- コントローラーを削除するためのコマンド
% rails destroy controller コントローラー名 ページ(コントローラーに含むアクション)名 ページ名2 ...
- HTTPメソッド
- GET: Web上のデータを読み込み
- POST: 新しくWeb上にデータを作成
- PATCH: Web上のデータを更新
- DELETE: Web上のデータを削除
- touch
コマンドは、ファイルやディレクトリのタイムスタンプ(更新履歴)だけを更新するためのコマンドだが、ファイルが存在しない場合は空ファイルを作成する。
- テスト(test/controllers/コントローラー名_controller_test.rb)で特定のhtmlタグの存在を確かめるアサーション: assert_select "htmlタグ名", "タグに含まれるテキスト"
- 各テストメソッドが開始される直前に実行されるメソッドの書き方
def setup 各テストで共通に使う変数やら処理を記述 end
- ビューファイル(app/views/クラス名/ページ名.html.erb)内におけるERB(Rubyの埋め込みコード)の書き方
<% ERBのコード %>
:コードを実行<%= ERBのコード %>
:コードを実行し、実行結果をその場所に挿入
- 全ページで共通に使われているレイアウト(app/views/layouts/application.html.erb)はそれぞれのページ(app/views/クラス名/ページ名.html.erb)で上書きが可能。以下はテンプレートコード。
<!DOCTYPE html> <html> <head> #ページ(app/views/クラス名/ページ名.html.erb)でtitleタグを使用されると上書きされる <title>アプリ名</title> #CSRF対策を行うRubyのメソッド呼び出し <%= csrf_meta_tags %> #スタイルシートを有効化 <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> #JavaScriptを有効化 <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> #この位置でページ(app/views/クラス名/ページ名.html.erb)を展開 <%= yield %> </body> </html>
- テスト rails test
の結果に、色を加えるには、テスト用ヘルパー(test/test_helper.rb)に minitest reportes
を以下のように加える。
require "minitest/reporters" Minitest::Reporters.use!
- ファイルが変更されたら自動テストを行う機能 Guard
の導入
- Gemfileのテスト環境
group :test
にgem ‘guard’
とgem ‘guard-minitest’
を追加しbundleインストール。 Guardを以下のコマンドで初期化。
% bundle exec guard init
Guardfileに適切な設定(テンプレートはこれ)を記述。
- .gitignoreに
/spring/*.pid
を追加。 以下のコマンドでGuardを起動。
% bundle exec guard
returnを押して、エラーが出たら、またreturnを押す。
- 自作ヘルパーはapp/helpers/application_helper.rbで記述し、ビューファイル内で使用可能。
- Rubyでは :シンボル名
をシンボル、”文字列”
を文字列と呼んで住み分けている。また、シンボル名では、頭文字に数字が使えなかったり、 -
が使えない。
- Rubyでは 関数(引数群)
と 関数 引数群
は等価( ()
省略可)。また、引数群の最後がハッシュ { リテラル: 値, リテラル2: 値2, ... }
だった場合も {}
省略可 => 関数 引数1, ..., リテラル: 値, リテラル2: 値2, ...
第5章 レイアウトを作成する
- Bootstrap CSSを有効化するには app/assets/stylesheets/custom.scss
に以下を記述。
@import "bootstrap-sprockets"; @import "bootstrap";
- CSSでは、html要素に対して、適用するスタイルを以下のように組み分け出来る
-
タグ名.クラス名 { 適用スタイル }
: 特定タグの特定クラス内の要素に適用。 -
.クラス名 { 適用スタイル }
: 特定クラスの要素に適用(タグは指定しない)。 -
#id名 { 適用スタイル }
: 特定id内の要素に適用(クラス、タグは指定しない)。また、クラス名で指定された場合よりもid名で指定された方が優先される。 -
タグ名 タグ2名 { 適用スタイル }
: 特定タグの中の特定のタグ2内の要素に適用。入れ子構造は何個でも出来る。
- アセットパイプライン: 画像などの静的ファイルを管理する仕組み
- マニュフェストファイル: アセットディレクトリ
app/assets
内の静的ファイルをどのように一つのファイルにまとめるかを記したファイル(実際に処理を行うのはsprocketsと言うgem)。 - プリプロセッサエンジン: マニフェストファイルを実行するツール。拡張子を右から順に実行する(拡張子が
.js.erb.coffee
だった場合、CofeeScript→ERB→JavaScriptの順で実行)。
- SCSSのネスト構造
- 要素(タグ、クラス、id)間のネスト
要素A { スタイルA } 要素A 要素B { スタイルB }
上記を以下の通りに書ける。
要素A { スタイルA 要素B { スタイルB } }
- 要素と属性間のネスト
要素 { スタイル } 要素:属性 { 属性時のスタイル }
上記を以下の通りに書ける。
要素 { スタイル &:属性 { 属性時のスタイル } }
- bootstrap-sassと言うgemをインストールすることにより、SCSS上で、LESS変数が使える。
- ルーティング(config/routes.rb)に新しいルートを書く時は HTTPメソッド ‘rootからの相対URL’, to: ‘コントローラー名#動かすアクション名’, as: ‘ルート名’
と記述。これにより ルート名_path
でURLを呼び出すことが出来る。
- 統合テスト(サイト内ページ全てに一括して行うテスト)作成には rails generate integration_test テスト名
を実行。test/integration/テスト名.rbが作成される。また、統合テストを実行するコマンドは rails test:integration
- テストで使用する assert_select パターン
で使えるパターン
-
”タグ名”, “テキスト”
:<タグ>テキスト</タグ>
があるかどうか。 -
”タグ名.クラス名”
:<タグ class=“クラス名”>〜</タグ>
があるかどうか。 -
”タグ#id名”
:<タグ id=“id名”>〜</タグ>
があるかどうか。 -
”タグ名[属性=属性名]”
:<タグ 属性=“属性名”>〜</タグ>
があるかどうか。 -
"a[href=?]", ルート, count: 2
:<a href=“ルート”>〜</a>
が2つあるかどうか。 -
"a[href=?]", ルート, text: “テキスト”
:<a href=“ルート”>テキスト</a>
があるかどうか。 -
タグ名>タグ2名
:<タグ>〜〜<タグ2>〜</タグ2>〜〜</タグ>
があるかどうか。
- テストに使用するヘルパーを自作する時は test/test_helper.rb
に記述
- ヘルパー用のテストは test/helpers/テスト名.rb
を作って以下のように記述
require 'test_helper' class ApplicationHelperTest < ActionView::TestCase test “テスト名” do テスト内容 end end
- 便利なヘルパー
-
link_to “メッセージ”, ‘リンク先のURL’, オプション
: リンクを作成。オプションにハッシュid: “id名”, class: “クラス名”
を渡して、idやクラス、または属性を指定したり出来る(以下のオプションも同じ)。また、メッセージ部分にimage_tagで画像を指定する事も出来る。 -
image_tag(“画像ファイル名”, オプション)
:app/assets/images/
内にある画像ファイル名
を表示させる。 -
render ‘layouts/パーシャル名’
:app/views/layouts/_パーシャル名.html.erb
の内容を出力する。汎用性の高いコードをパーシャル化しておき、renderヘルパーで呼び出す事によって、同じコードを書く手間を省き、コードを見やすくしている。
-
sqlite3を開発環境で使いたい場合は、Gemfile内で
:production
(本番環境[Heroku])と:development, :test
(開発環境とテスト環境)とでインストールするgemを分ける。↩ -
テーブルBのカラムに
テーブルAの単数形_id:integer
を作成しておく。↩ -
モデルがデータベースにアクセスできたり、カラムをRubyライクに記述できるのは
ActiveRecord::Base
のおかげ。また、コントローラーでモデルオブジェクト(UserとかMicropostとか)が使えたり、httpリクエストのフィルタリング、Viewをhtmlとして出力する事が出来るのはActionController::Base
のおかげ。↩