rails 技術ブログ

rails 技術ブログ

勉強したことをアウトプットしていきます

【Ruby】オブジェクト指向とは

rubyを勉強する上で欠かせない、「オブジェクト指向」について自分なりにまとめてみました。

オブジェクト指向とは

オブジェクトとは、簡単にいうとモノのこと。 Rubyではほとんど全てのものがオブジェクトである(ifやelseなど、一部オブジェクトでないものもあり)。
モノ(オブジェクト)を組み立てて、設計していくことをオブジェクト指向と呼ぶ。

オブジェクト指向を理解する上で必要な要素【クラス・インスタンス・メソッド】

クラス
設計図のこと。

インスタンス
クラスを具体的にしたもの。
例えば「犬クラス」があったとしたら、犬種(チワワ、トイプードルなど)がインスタンスになる。

メソッド
メソッドで動作の指示ができる。
先ほどの犬クラス自体はまだ何もできないが、「走る」「吠える」といったメソッドを渡すといったイメージ。

class Dog

  def run
    puts 走る
  end
#メソッドを定義

  dog = Dog.new('チワワ')
#インスタンスの作成
end



■参考にした記事

オブジェクト指向がわからない! そんなあなたの脳味噌をオブジェクト脳にする準備体操:CodeZine(コードジン)

【Ruby】たい焼きで理解するオブジェクト指向におけるクラスの概念 | Pikawaka - ピカ1わかりやすいプログラミング用語サイト

【Rails】リクエスト/レスポンス処理の流れ(MVC)

Webブラウザでページをクリックして、そのページが表示されるまでの流れをご説明します。
まず、大まかな全体像はこちら↓
f:id:terakura-aina:20201214122052p:plain

次に1つずつ、どのような処理がされているのかを細かく見ていきます。


具体的な例えがある方がわかりやすいので、「ブログアプリの記事一覧を見たい」としましょう。

WebブラウザからWebサーバーにHTTPリクエストが送られる

f:id:terakura-aina:20201214113654p:plain

②Webサーバーはルーター/articles/indexのGETリクエストを伝える

f:id:terakura-aina:20201214114754p:plain

ルーターはarticlesコントローラにindexアクションを呼び出すよう伝える

f:id:terakura-aina:20201214115444p:plain

④articlesコントローラはindexアクションを呼び出す際に、indexアクションの中のArticle.all(記事の全データ)を呼び出すため、Articleモデルに要求

f:id:terakura-aina:20201214120151p:plain

⑤ArticleモデルはデータベースにArticle.allのデータを要求する
⑥データベースは要求されたデータを探し、モデルに返す

f:id:terakura-aina:20201214120816p:plain

⑦モデルは返ってきたデータをコントローラに渡す

f:id:terakura-aina:20201214122740p:plain

⑧コントローラは受け取ったデータをインスタンス変数に代入し、ビューで使用できるようにする
⑨ビューは受け取ったインスタンス変数等を元に、HTMLを作成し、コントローラに返す

f:id:terakura-aina:20201214122859p:plain

⑩出来上がったHTMLをWebサーバーに返す
⑪Webサーバーは受け取った情報をWebブラウザに返し、WebブラウザがHTMLを人が見えるように変換して表示してくれる



■参考にした記事

DIVE INTO CODE | Railsの処理の流れを理解しよう

Rails開発者が採用面接で聞かれる想定Q&A 53問(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

assign_attributesとは

assign_attributesとは

Active Recordで用意されている、特定のattributeを変更するためのメソッド。

def update
    @article.assign_attributes(article_params)
  if @article.save
    flash[:notice] = '更新しました'
    redirect_to edit_admin_article_path(@article.uuid)
  else
    render :edit
  end
end

update_attributesなどと違い、DBへの保存は行われないので、別途saveメソッドを使ってあげる必要があります。
ちなみに、updateとupdate_attributesの違いは引数の渡し方が違うのと、update_attributesはバリデーションのチェックがされないそうです。

※参考にしたサイト

まとめてオブジェクトの属性を変更したい時に便利!assign_attributesメソッド - その辺にいるWebエンジニアの備忘録

update_attibutesとassign_attributes違い - Qiita

【Rails】updateメソッドの使い方を徹底解説! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト

三項演算子について

例①

@article.state = @article.publishable? ? :published : :publish_wait

↑の書き方は三項演算子というもの。

条件 ? 結果1 : 結果2

これは以下のように書き換えられる。

if 条件
  結果1
else
  結果2
end



つまり、例1は以下と同じ意味

(@article.state = @article.publishable?) ? (:published) : (:publish_wait)

if @article.state = @article.publishable?
  :published 
else
  :publish_wait



※参考にしたサイト

【Ruby・Rails】三項演算子(条件演算子)を使ってif文をスリムに書こう! - Qiita

【Ruby】コメントアウトする

# コメント
def foo; end #行の途中からでもコメントアウトできます

#をつけることでコメントアウトできます。

複数行のコメントアウトをしたい場合は

=begin
ここに
コメントアウトしたい文章を
入力
=end

=begin=endの間にコメントを入力

既に入力してあるコード等をコメントアウトしたい場合、範囲を洗濯してcommand⌘+/で一括コメントアウトできます。

Kaminariを使ってページネーションする

ページネーションとは

コメント一覧などを表示した時に、数が多くなると下の方までスクロールするのが大変になる。
そこで、ページを分割して表示するもの。

使い方

公式サイトはこちらです。
https://github.com/kaminari/kaminari

①Kaminariをインストールする

gem 'kaminari'

bundle installでGemを読み込む

$ bundle install


②追加したいコントローラーのアクションに設定をする

@users = User.order(:name).page(params[:page])
#.page(params[:page])の部分を記述することでページネーションが可能になる

③ビューのページネーションを表示させたい箇所に以下のコードを追加する

<%= paginate @users %>



設定が完了すると<%= paginate @users %>と記述した箇所に以下のようなページネーションが現れます。
(添付写真はBootstrap4のスタイルを当てています) f:id:terakura-aina:20201111142928p:plain

カスタマイズ等

公式ページにも記載がありますが、1ページに表示する数などがデフォルトで設定されているので、設定を変えたい場合は、

$ rails g kaminari:config

とコマンドを実行するとconfigファイルが作成されるので、そのファイルをいじることで変更することが可能です。

# frozen_string_literal: true

Kaminari.configure do |config|
  # config.default_per_page = 25
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
end

設定を変更するときは最初の#を外し、数字等を書き換えることで変更可能になります。

uniqueness: { scope: }を使ってユニーク制約を実装する

ブックマーク機能を実装したいと考えた時、「掲示板のユーザーは1つの掲示板に対して1ブックーマークしかできない」はずなので、そのためのバリデーションを設定します。

それを設定するのが以下のvalidates :user_id, uniqueness: { scope: :board_id }という記述です。

class Bookmark < ApplicationRecord
  belongs_to :user
  belongs_to :board
  validates :user_id, uniqueness: { scope: :board_id }
end