記事概要
フレームワークRuby on Railsについて、まとめる
基本理念
基本理念を遵守することで、フレームワークの能力を最大限に活かすことができる
DRY(Don't Repeat Yourself)
「同じ情報を繰り返し定義しない」という考え方
情報:メソッドや配列など、データの集合体など
→同じコードを繰り返し記述しないという捉え方で問題ない
- メリット
- 可読性が向上する
- コード量を減らすことによって、アプリケーションの動作が早くなる
# Not DRY
orange_price = 100 * 1.1
peach_price = 200 * 1.1
apple_price = 300 * 1.1
# DRY
tax = 1.1
orange_price = 100 * tax
peach_price = 200 * tax
apple_price = 300 * tax
CoC(Convention Over Configuration)
「設定よりも規約を優先する」という考え方
- メリット
- 開発スピードが上がる
- 質を担保できる
- 規約は開発者同士の共通認識であるため、可読性が向上する
# Not CoC
class TestsController < ApplicationController
def render_top_page
render template: "tests/index"
end
end
# CoC
class TestsController < ApplicationController
def index
end
end
ディレクトリ
Ruby on Railsのアプリケーションのディレクトリ階層は、規約に則って整理されている
- アプリ名
- app
※ MVCに関するファイルなどを格納している、アプリケーションの主要ディレクトリ - bin
※ Binary Codeの略。コマンドなどで実行するファイルが格納されている - config
※ アプリケーションの設定関係のファイルが格納されている - db
※ データベースに関するファイルが格納されている - lib
※ libraryの略で、基本的なライブラリが格納されている - log
※ アプリケーションが動いている間の記録などのファイルが格納されている - node_modules
※ nodeのパッケージが格納されている - public
※ デフォルトで表示される画面の情報などが格納されている - storage
※ 画像などをアプリケーション自体に保存する際に使用するディレクトリ - test
※ アプリケーションのテストを行う際に使用するファイルを格納するディレクトリ - tmp
※ アプリケーションが起動している際の一時的な情報を格納するディレクトリ - vendor
※ ライブラリ(Gem)などをアプリケーション自体にインストールする際に使用するディレクトリ - .browserslistrc
- .ruby-version
- babel.config.js
- config.ru
- Gemfile
- Gemfile.lock
- package.json
- postcss.config.js
- Rakefile
- README.md
- yarn.lock
- app
オブジェクト指向
オブジェクト指向言語であるRubyで作られているため、Ruby on Railsもオブジェクト指向の考えに則って作られている
Viewの構造を意識
Action View
Ruby on Railsのアプリケーションにおいて、ビューの機能を実現するために必要な処理のオブジェクトのこと
ヘルパーメソッド
ビューでHTMLタグを出現させたりテキストを加工するために使用するメソッドの総称
あらかじめ用意されているヘルパーメソッドは、こちらを参照
すでに用意されているヘルパーメソッド以外に、ヘルパーメソッドを自作することもできる
モジュール
Rubyにおける「インスタンスを生成できないクラス」のようなもののこと
module モジュール名
end
module Sample1
class Test
end
end
module Sample2
class Test
end
end
# Testクラスの呼び出し
Sample1::Test
Sample2::Test
Helper
ヘルパーメソッドを作成できるモジュール
app/helpers
配下に用意されており、application_helper.rb
や各コントローラーに対応したhelperのファイルに処理を記述することでヘルパーメソッドとして使用できる
作成方法は、こちらを参照
module ApplicationHelper
def sample
# sampleというヘルパーメソッド
end
end
<!-- application_helper.rbで定義したsampleのヘルパーメソッドを、ビューファイルで使用できる -->
<%= sample %>
コントローラーの構造を意識
Action Controller
Ruby on Railsのアプリケーションにおいて、コントローラーの機能を実現するために必要なオブジェクトのこと
レンダリング
指定したHTMLなどのビューファイルを画面に描画すること
フォーマットは、JSONを使用する場合が多い
サービスクラス
コントローラー内のコードの可読性を高めるために用いる概念
作成方法は、こちらを参照
モデルの構造を意識
Active Model
Ruby on Railsのアプリケーションにおいて、モデルの機能を実現するために必要なオブジェクトのこと
Callbacksモジュール
データ保存時などの任意のタイミングで実行する処理を設定できるモジュール
class Tweet < ApplicationRecord
validates :text, presence: true
# バリデーションの後で「puts_done」を実行
after_validation :puts_done
private
# 「puts_done」という、任意のタイミングで実行する処理を登録
def puts_done
puts 'validation completed'
end
end
Validationsモジュール
データの保存時に検証するような役割がある
Serializationモジュール
JSONなどで返却される値を整えることができるモジュール
- Serializationモジュールを使用しないケース
tweet.rb
class Tweet < ApplicationRecord validates :text, presence: true end
tweets_controller.rbclass TweetsController < ApplicationController def index @tweets = Tweet.includes(:user).order("created_at DESC") render json: @tweets end end # JSONで返却されている内容は「id, text, image, created_at, updated_at, user_id」 # [ # {"id":2,"text":"太陽の写真","image":"data:image/sample","created_at":"2020-04-22T06:11:44.134Z","updated_at":"2020-04-22T06:11:44.134Z","user_id":1}, # {"id":1,"text":"綺麗な景色","image":"data:image/jpeg;base64,/9j","created_at":"2020-04-22T06:11:25.425Z","updated_at":"2020-04-22T06:11:25.425Z","user_id":1}, # ]
- Serializationモジュールを使用するケース
tweet.rb
class Tweet < ApplicationRecord # JSONで返却する値を指定するために追加 def attributes {'text' => nil, 'image' => nil} end validates :text, presence: true end
tweets_controller.rbclass TweetsController < ApplicationController def index @tweets = Tweet.includes(:user).order("created_at DESC") render json: @tweets end end # JSONで返却されている内容は「text, image」 # [ # {"text":"太陽の写真","image":"data:image/sample"}, # {"text":"綺麗な景色","image":"data:image/jpeg;base64,/9j"} # ]
Formオブジェクト
フォームに関する処理を切り出す仕組みのことであり、大きく分けて下記2つの場合に使用する
- フォームから入力された値が複数のモデルに関連するデータであり、一度に複数モデルを操作して、それぞれのデータを更新したい場合
実装方法の説明- モデルを生成する
item.rb
class Item < ApplicationRecord end
genre.rbclass Genre < ApplicationRecord end
-
app/models
ディレクトリ配下に、item_form.rb
を手動生成する - itemモデルとgenreモデルの情報を検証・保存する処理を記述する
item_form.rb
class ItemForm include ActiveModel::Model attr_accessor :text, :genre validates :text, presence: true validates :genre, presence: true def save Item.create(text: text) Genre.create(genre: genre) end end
- コントローラーで、ItemFormというクラス名を呼び出す
items_controller.rb
class ItemsController < ApplicationController def index end def create @item = ItemForm.new(set_params) if @item.valid? @item.save end end private def set_params params.permit(:text, :genre) end end
- モデルを生成する
- フォームから入力された値に対応するモデルは無いものの、バリデーションをかけたい場合
モデルによるデータベースの操作
ActiveRecord
モデルによるデータベースの操作を実現する仕組み
Ruby on Railsまとめ