はじめに
Ruby on Rails5速習実践ガイドを読んだ所感を書いていこうと思います。
良かったところ
-
Railsのベストプラクティスや注意点も適切に説明されており、安全かつ効率的なコーディングの方法を学ぶところ
-
MVCアーキテクチャやルーティング、データベース操作などについて詳しく解説されており、実践的な例題やコードスニペットも豊富で分かりやすかったところ
難しかったところ
前提知識が必要なところ
Ruby on railsを学習するにあたってRuby,SQL,dockerなどの前提知識が必要であり、総合的に理解してないと実装できないと感じました。
開発環境構築
実際にコードを書くために環境構築を行ったのですが、本のバージョンが古いため全くうまくいかずかなりの時間を消費してしまいました。
下記のURLを参考に開発環境構築をしました。
学んだところ
下記がこの本を読んで新たに学んだことになります。
Slim
SlimはRuby on Railsフレームワークで利用できる人気のあるテンプレートエンジンです。
Slimは、シンプルで読みやすい構文を持ち、HTMLをより短く記述することができます。
ProgateなどではERBというテンプレートエンジンが採用されていたが、railsを使った開発の現場では、htmlをツリー構造として簡潔に表現できるslimという別のテンプレートエンジンが利用されることが多くなっています。
div.container
h1 Welcome to my website
p This is a Slim template example.
ul
- fruits.each do |fruit|
li = fruit
上記のSlimのコードは、div要素内にh1要素やp要素をインデントで表現しています。ループ処理も短い構文で表現されており、fruitsという配列の要素をli要素として表示しています。
ヘルパーメソッド
ヘルパーメソッド(Helper Method)は、ビューテンプレート内でよく使用される共通の機能や処理を実装するためのメソッドであり、ビューファイル内でRubyのコードを使用して柔軟な処理を行うために使用されます。
主に下記のような役割を果たします。
1. 表示のフォーマット: データの表示形式を整形したり、テキストをエスケープしたりすることができる。
例えば、日付を特定の形式で表示したり、テキストをHTMLエスケープしてクロスサイトスクリプティング(XSS)攻撃を防ぐために使用されます。
#日付を特定の形式で表示するヘルパーメソッド
def formatted_date(date)
date.strftime("%Y-%m-%d")
end
上記のヘルパーメソッドは、与えられた日付オブジェクトを「年-月-日」の形式で表示する役割を果たします。ビューファイル内で次のように使用できます
p = formatted_date(@user.created_at)
2,URL生成: ルート名やパスヘルパーを使用して、アプリケーション内の異なるページへのリンクを生成することができる
例えば、link_toヘルパーメソッドを使用してリンクを作成することができます。
# リンクを生成するヘルパーメソッド
def link_to_user(user)
link_to user.name, user_path(user)
end
上記のヘルパーメソッドは、与えられたユーザーオブジェクトの名前とリンクを生成します。ビューファイル内で次のように使用できます
= link_to_user(@user)
3,フォーム作成: フォームを作成する役割もある
例えば、form_forヘルパーメソッドを使用してモデルオブジェクトに基づいたフォームを簡単に生成することができます。
= form_for @user do |f|
= f.label :name
= f.text_field :name
= f.label :email
= f.email_field :email
= f.submit
上記の例では、form_forヘルパーメソッドを使用して@userモデルオブジェクトに基づいたフォームを作成しています。フォーム内の各要素には、f.labelとf.text_fieldなどのヘルパーメソッドが使用され、f.submitで送信ボタンが生成されています。
パーシャルテンプレート
パーシャルテンプレート(Partial Template)は、再利用可能なビューコンポーネントを作成するための仕組みであり、他のビューファイルから呼び出され、部分的なコンテンツを表示するために使用されます。
ファイル名の先頭にはアンダースコアをつけます。なお、パーシャルテンプレートをrenderメソッドで呼び出す際には、アンダースコアをつけない名前を用います。
明示的にローカル変数として渡すことで、インスタンス変数の定義に依存しない、再利用性の高いパーシャルにすることができるのでlocalsオプションを利用する
localsオプション
localsオプションは、パーシャルテンプレートに変数を渡すためのオプションであり、使用することで、パーシャル内で変数を使用したり、データを受け渡したりすることができます。
h1 Post Details
= render partial: 'comments/comment', locals: { comment: @post.comments.first }
上記の例では、show.html.erbビューファイルからcomments/commentパーシャルテンプレートを呼び出しています。localsオプションを使用して、comment変数をパーシャルテンプレートに渡しています。
div.comment
p = comment.body
span.author = comment.author
このように、localsオプションを使用することで、パーシャルテンプレート内で親ビューファイルから受け取ったデータや変数を利用できます。
これにより、パーシャルテンプレートの再利用性と柔軟性が向上し、ビューの部分的なコンテンツを簡単に表示することができます。
ボッチ演算子
&.演算子は、オブジェクトのメソッド呼び出しや属性アクセスを行う際に、オブジェクトがnilである場合にエラーを避けるために使用されます。
通常のメソッド呼び出しや属性アクセスでは、オブジェクトがnilの場合にNoMethodErrorやundefined methodのエラーが発生しますが、&.演算子を使用することで、エラーを回避し、安全に操作を行うことができます。
モデルとフラグの関係性
モデルは、アプリケーション内で扱われるデータの構造を定義するものであり、データベースのテーブルに対応することが一般的です。通常は、属性や関連、バリデーションなどを定義し、データベースとのやり取りやビジネスロジックの実装に使用されます。
フラグは、データの状態や条件を示すためのフラグ(フラグとは、真偽値を持つ変数のこと)です。モデル内の属性として定義され、データの特定の状態を表現するために使用されます。真偽値に基づいて制御フローの判断や条件分岐を行うため、データの状態管理に重要な役割を果たします。
例えば、ユーザーモデルには、activeというフラグ属性があり、このフラグ属性は、ユーザーアカウントが有効か無効かを示すために使用されます。activeがtrueの場合はアカウントが有効であり、falseの場合はアカウントが無効であるというような使い方です。
モデルとフラグの関係性は、データモデリングやビジネスロジックの実装によって異なります。フラグ属性はモデル内で定義され、その属性の値に基づいてデータの状態や条件を管理することができます。
Scope
クエリ用のメソッドを用いることでデータベーステーブルに対する操作やフィルタリング、ソート、集計などの操作を行うために使用されます。これらのメソッドは、データベースクエリを直接書く代わりに、Rubyのメソッドチェーンを使用して簡潔かつ柔軟なクエリを構築することができます。
クエリー用のメソッドの連続した呼び出し部分をまとめて名前をつけ、カスタムのクエリー用メソッドとして使うことができます。
これをScopeメソッドと言います。
Scopeを使うと、繰り返し利用される絞り込み条件をすっきり読みやすくできます。
class Post < ApplicationRecord
scope :latest, -> { order(created_at: :desc).limit(5) }
end
上記のように書くことによって繰り返し利用される絞り込み条件をすっきり読みやすくすることができます。
Rspec
RubyにおけるBDD(ソフトウェア開発の手法の一つであり、ソフトウェアの振る舞いを中心に開発を行うアプローチ)のためのテスティングフレームワークです。
動く仕様書として自動テストを書くという発想で作られており、要求仕様をドキュメントに記述するような感覚でテストケースを記述することができます。
Rspecは開発現場で広く利用されており、railsとともにRspecは十分実用性があります。
Rspecの基本的な構文
describe
describeはテストのグループ化を宣言します。
ここでは「四則演算に関するテストを書くよー」と宣言しています。
ちなみに describe は日本語にすると、「~を述べる」「~を説明する」「~を記述する」という意味です。
it
itはテストを example という単位にまとめる役割をします。
it do ... end の中のエクスペクテーション(期待値と実際の値の比較)がすべてパスすれば、その example はパスしたことになります。
expect(X).to eq Y
expect(X).to eq Y で記述するのがエクスペクテーションです。
expect には「期待する」という意味があるので、 expect(X).to eq Y は「XがYに等しくなることを期待する」と読めます。
よって、 expect(1 + 1).to eq 2 は「1 + 1 が 2 になることを期待する」テストになります。
簡単に言うと期待値と実際値が等しいことを確認しています。
Capybara
WEBアプリケーションのE2E(ソフトウェア開発のテスト手法の一つであり、システム全体の動作をテストするアプローチ)テスト用フレームワークです。
Capybaraは、ブラウザシミュレーションを通じて、ユーザーが行う操作や振る舞いを自動化してテストするための便利なメソッドやユーティリティを提供します。
WEBアプリケーションのブラウザ操作をシュミレーションできるほか、実際のブラウザと組み合わせてJavascriptの動作まで含めたテストを行うことができます。人が手作業で確認していたようなブラウザを操作することができます。
FactoryBot
FactoryBotを利用することで、テストの出=他を簡単に用意し、テストから呼び出して利用することができます。
テストデータを作成するための機能yとしては、railsが標準で用意しているFixtureという仕組みもあり、FactoryBotはFixtureの代替のgemの位置付けになっています。
FactoryBotでは、DSLを使って似たデータを効率よく定義することができ、ActiveRecordモデルに実装したコールバックなどの資産を直接的に活用してデータの状態やデータ間の関係性などを制御しやすくなっています。
例文
下記のテストコードはユーザーAを作成し、ユーザーAが作成したタスクが一覧表示されることを確認するテストケースです。
require 'rails_helper'
describe 'タスク管理機能',type: :system do
describe '一覧表示機能' do
before do
#ユーザーAを作成しておく
user_a = FactoryBot.create(:user,name:'ユーザーA'email:'a@example.com')
#作成者がユーザーAであるタスクを作成しておく
FactoryBot.create(:task, name: '最初のタスク',user:user_a)
end
context 'ユーザーAがログインしているとき' do
before do
#ユーザーAでログインする
before do
visit login_path
fill_in 'メールアドレス',with: 'password'
fill_in 'パスワード': 'password'
click_button 'ログインする'
end
it 'ユーザーAが作成したタスクが表示される' do
#作成済みのタスクの名称が画面上に表示されていることを確認
expect(page).to have_content '最初のタスク'
end
end
end
end
上記のコードを実行し、
1example,0failurs
と表示されれば無事テストをパスできたことが確認できます。