Torihaji's Growth Diary

Little by little, no hurry.

初心者が Ruby on rails を齧ってみた感想

はじめに

みなさん、こんにちは torihaziです。

今回は 2週間くらい前から Ruby on railsを学習しています。

ちゃんとしたフレームワークを学ぶのは

これが初めてになりますがなんとかノリでやっていこうと思います!

今回はいつもとテイストを変えて

授業のノートのように 不明点や詰まったところを中心に

1章1章まとめていこうかと思います。

丸パクリだけは気をつけて頑張ります!

それでは ltg

参考書籍

現場で使える Ruby on Rails 5速習実践ガイド | 大場寧子, 松本拓也, 櫻井達生, 小田井優, 大塚隆弘, 依光奏江, 銭神裕宜, 小芝美由紀 |本 | 通販 | Amazon

学習したこと

1章 Rails の前に Rubyを学ぶ

全てがオブジェクト

RubyRailsでは全てがオブジェクトになります。

オブジェクトとは、現実世界の物理的なモノから抽象的な概念をプログラミングで扱えるように考えだされたもの

データ(値)や処理(メソッド)を格納して随時呼び出すことができます。

Rubyでは オブジェクトの種類として 文字列、数値、配列、シンボル、範囲・・など多くのオブジェクトが元から用意されており

それぞれに固有のメソッドが付与されています。

メソッドとは

上でメソッドというものを前触れもなく記載しましたが、私は次のように理解しました。

メソッドとは対象の振る舞いを決めるもので、他言語でいう関数に相当するものです。

メソッドの中にも種類があり、Rubyがあらかじめ用意している組み込みメソッドや開発者が新しく作ったメソッドなどがあります。

Rubyにおいてメソッドは オブジェクトに作用させることで効果を発揮します。

使用方法は object.methodというように ".(ドット)"を付与することで機能します。

このメソッドを持つオブジェクトのことをレシーバと呼びます。

null ではなく nil

SQLでは何もないことを Nullと表現しますが、Rubyでは nilを使用します。

これもまたオブジェクトです。

if

Rubyにおける真偽を確かめる方法に if 文がありますが、

Rubyは 0 も true扱いになります。

falseになるのは nil か falseのみです。

間違えないようにしましょう。

キーワード引数

与える引数の意味を一目でわかるように設定するものです。

また与える引数の順番を気にしなくて良くなるので、

デフォルト引数を使用している際は、デフォルト引数をはじめの方に寄せなければならないということをしなくて良くなります。

クラスとモジュール

クラスもモジュールも何かをまとめたものでありますが、

クラスがオブジェクトのあれこれをまとめたもので

モジュールはメソッドをまとめたものになります。

ただモジュールはクラスのようにインスタンス化することはできず

用途としては複数オブジェクト間で共通の処理を使いたいときに使用します。

Rubyは複数の親を継承する多重継承をすることができないので

モジュールを使ってこの問題点を解決します。

使用する際は includeメソッドを使用します

& ぼっち

使用方法に癖がありますが、これを使用することで

レシーバがnilであってもエラーを返さなくなります。

ログイン時のcurrent_userなどを使用する際に真価を発揮しそうです。

2章 Rails アプリを覗く

Railsアプリの雛形作成

作業用のフォルダで下記コマンドを実行することで Railsアプリの雛形を作成することができます。

rails new アプリ名 [-d データベース名 ]・・・

データベースを作成

Railsアプリで使用するデータベースを作成するためには次のコマンドを実行します。

bin/rails db:migrate

rails ではなく bin/railsコマンドを使用することで、Gemfile通りのgemを利用できる環境でコマンドを実行できます。

開発用サーバ起動

Railsアプリをブラウザで確認するために使用する開発用サーバは下記コマンドで起動できます。

bin/rails s

MVC

MVCというのは Model 、View、 Controllerの頭文字をとったものです。

UIがあるアプリケーションを作る際の設計手法、概念のことです。

  • データベースとのやりとりを司る Model
  • モデルやビュー、リクエスト、レスポンスなど色々なところとのやりとりを司る Controller
  • アプリの見せる部分の生成を司る View

3章 アプリ作成の準備

データベースは環境ごとにある

データベースとはデータを保存するところです。

しかし開発をする上でデータには複数の種類が存在します。開発用のデータ、テスト用に作ったデータ、本番運用していく中で蓄積されたデータです。

これらを分けるためにデータベースも分ける必要があります。Railsは3種類のデータベースがあります。

  • 開発環境 - development
  • テスト - test
  • 本番 - production

テンプレートエンジン

アプリはユーザに見せる画面を最終的にHTMLで表現します。

Railsでのビュー開発はテンプレートエンジンを使用して行うと開発を進めやすくなります。

デフォルトは ERBですが、そのほかにもHamlやSlimがあります。

モデルの雛形作成

モデルを作成するためには下記コマンドを実行します。

bin/rails g model [モデル名] [属性名: データ型・・・]

マイグレーション

データベースへテーブルを追加するためにはマイグレーションを使用する。

データベースへの変更の1つ1つを rubyのプログラムとして行います。

また状態の履歴を追うことができます。

下記コマンドでマイグレーションを実行することができます。

bin/rails db:migrate

コントローラとビュー

モデル作成と同様にジェネレータを使用して下記コマンドで作成することができます。

bin/rails g controller コントローラ名 [アクション名 アクション名 ・・・]

このようにすることでアクション名と同名のビューが作成されます。

HTMLにおいてaタグの要素を出力するためのメソッドで下記の書式です。

link_to 'リンク名', リンク先のURL, a 要素につける属性指定

Flashメッセージ

redirect_toに渡すことができるメッセージのことです。

次のリクエストに対して少しのデータを渡すためにRailsが用意している仕組みです。

パーシャル

ビューファイルで重複しているレイアウトを部品化して使いまわせる仕組みのことです。

パーシャルテンプレートのファイル名は先頭にアンダーバーを付与します。

4章 現実の複雑さに対応する

モデルに制約を

データベースのカラムに制約をつけることができます。

非ヌル制約は null: falseを

文字列長さは limit: 長さを

一意制約は unique: trueをマイグレーションファイルに設定します。

バリデーション

データを保存するときに保存するデータを検証する必要があります。

その検証のことをバリデーションといい、モデルファイルに下記を追記することで設定できます。

  • 必須か - presence: true
  • 文字列の長さは - length { maximum: 30 } など

セッション

サーバ上に保存する小さな情報もしくはその領域のことです。

HTTPプロトコルはステートレスであるためCookieを使用してログインというものを実現することができます。

セッションとは異なりブラウザ側に保存する小さな情報もしくはその領域のことです。

複数リクエストの間で状態の保存をすることができます。

5章 テスト

RSpec

Railsのminitestと同じようなテストフレームワークのことです。

動く仕様書という発想で作られているそうです。

Capybara

Rspecと組み合わせて使用します。ブラウザ操作をシュミレーションできたりjavascriptの動作までテストすることができます。

人が行う操作をコード化して実現するというイメージです。

FactoryBot

テスト用のデータを作成することができるgemです。

Fixtureという仕組みもありますが、Factorybotの方が便利だそうです。

ログインという操作をコード化

ログイン操作は下記のようなコードで実現可能です。

visit login_path
fill_in 'メールアドレス', with: 'a@example.com'
fill_in 'パスワード'm with: 'password'
click_button 'ログインする

直感的に何をしているかがわかります。

6章 Railsの全体像を理解する

ルーティング

ルーティングとはクライアントからこのURLでリクエストが来たらどのコントローラのどのアクションを呼び出すかを決定させるものです。

書き方としては次のようなものがあります。

get '/login', to: 'sessions#new'
resources : tasks

Strong Parameters

コントローラでリクエストパラメータを受け取る際に、想定外の値を受け取らずおかしい処理をしないようにするための仕組みです。

アセットパイプライン

JavascriptCSS 、画像を効率的に配信する仕組みです。

主な機能としてはコンパイル、アセットの連結、アセットの縮小圧縮、ダイジェストの付与です。

ブラウザにアセットを読み込ませる

Rails ではCSSを読み込むためにstylesheet_link_tagを、Javascriptタグを読み込むにはjavascrupt_include_tagというヘルパーメソッドを使います。

マニフェストファイル

アセットパイプラインにおいてファイルをどのように連結して出力するのかを記述したファイルです。

app/assets/application.cssやapp/assets/application.jsといったものが該当します。

sass-rails gemが有効なら Sassでマニフェストファイルを記述できます。

application.js

記載方法は次のようなものがあります。

  • require 指定したjavascrptの内容を記述した位置に取り込みます。拡張子は省略可能です。
  • require_tree 指定したディレクトリは以下の全ファイルの内容を結合し、記述した位置に取り込みます。

application.css

記載方法はSassということで @import で記述します。

プリコンパイル

production環境でアプリケーションを動かすために必要です。

あらかじめアセットパイプラインを実行して静的ファイルを生成する処理のことです。

下記コマンドで実行できます。

bin/rails assete:precompile

master.key

本番環境でアプリを利用する場合、Railsが同環境の秘密情報を複合するために利用する鍵です。

config/master.key もしくは 環境変数 RAILS_MASTER_KEYです。

本番環境でサーバ起動

下記コマンドです。

bin/rails s --environment=production

credentials.yml.enc

マスターキーによって暗号化された秘密情報のことです。

実物は config/credentials.yml.encにあります。

参照する場合は bin/rails credentials:showです。

編集する場合は bin/rails credentials:editです。

絶対に紛失しないようにしましょう。

7章 機能追加

ransack

検索機能を追加するためのgemです。ransackメソッドが追加され検索することができます。

search_form_forメソッドを使って、検索用のフォームを追加できます。

またソート機能もついており、sort_linkヘルパーを使うことで可能になります。

メーラー

Railsではメールを送るためにAction Mailerという機能があります。

メーラーを作成するには下記コマンドです。

bin/rails g mailer メーラー名

deliever_nowメソッドを使うことで即時送信を行うことができます。

メーラーの動作確認

mailcatcher というgemを利用します。

使用方法は mailcathcer というコマンドを実行してから実際にメールを飛ばすという感じです。

Active Storage

画像ファイルを管理するために必要なgemです。

クラウドストレージへファイルをアップロードしてActiveRecordに紐づけることをしています。

下記コマンドでインストールできます。

bin/rails active_storage:install

そのあとマイグレーションファイルが作成されるので db:migrateします。

ページネーション

ページネーションは kaminari というgemをインストールします。

8章 javascript

こちらは後日学習するので飛ばします。

9章 チーム開発

こちらは gitに関することだったので飛ばします。

終わりに

かなり超大作でした。

この書籍は rails 5対応なので、個人環境でrails 7で書き直してみましたが

bootstrapの箇所など 挙動が異なる箇所が多かったので

詰まりながら調べながらでなかなか苦戦しました。

これからのアウトプットで入れたものを出して、

足りなければまた入れてを繰り返して定着を図っていきたいと思います。

まだまだ道は長いですが、頑張りましょう。

僕も頑張ります。