【パーフェクトRuby on Rails】2章の気づき

-2018.10.7 -書籍
-, ,

スキマ時間を見つけてはパーフェクトRuby on Railsを読みながら写経しています。
読了までの道はまだありますが読み終えた章ごとに気づきがありそうなので
定期的にメモ用にもアウトプットして行こうと思います。

スポンサーリンク

2章の内容:MVCアーキテクチャ

Railsを特徴づける概念としてMVCアーキテクチャがあります。
これはRailsの基本的概念で、まとめると以下の役割分担のことを指します。
2章では書籍管理アプリを題材としてこれらそれぞれについて触れました。

  • Model:データベースの接続とデータに対する操作、およびロジック
  • View:Modelの内容を参照して視覚表現を行う
  • Controller:Modelのロジック呼び出し、必要なViewの選択など、ModelとViewをつなぐ

理解が曖昧だったActiveRecord:Relation

「rails c」で以下を入力すると、ActiveRecord:Relationが返ってきます。

where以降のメソッドチェーンをQuery Interfaceと呼び、
ActiveRecordに対してQuery Interfaceが呼ばれると
ActiveRecord:Relationのインスタンスが生成される構造になっています。

Book.where('price > ?', 2000).limit(3).order(:name)

Book Load (0.8ms)  SELECT  "books".* FROM "books"  WHERE (price > 2000)  ORDER BY "books"."name" ASC LIMIT 3
#=> ActiveRecord::Relation [...]

ActiveRecord:Relationはto_aメソッドで配列に変換できるので
each内部などで利用する時に都度DBにアクセスする必要がなくなり有用だと思いました。

Book.where('price > ?', 2000).limit(3).order(:name).to_a

Book Load (0.8ms)  SELECT  "books".* FROM "books"  WHERE (price > 2000)  ORDER BY "books"."name" ASC LIMIT 3
#=> [Book id: 3, name: "Book 3", ・・・]

scopeを定義する

scopeはあまり意識して使えていなかった。。
scopeを用いることで得られる利点を考えると使い倒すべきですね。

  • 繰り返し利用するクエリの再利用性が上がる
  • クエリに名前をつけることで可読性が向上する

下記written_aboutのように特定のパラメータを利用するスコープも定義可能で、
Book.written_about(‘test’) のように利用できるのも良い。

class Book < ActiveRecord::Base
  scope :costly, -> { where('price > ?', 3000) }
  scope :written_about, -> (theme){ where('name like ?', "%#{theme}%") }
end	end

独自バリデーション

『validate ブロック』の構文で処理する。
以下は、本の名前に「exercise」という文字列があればエラーにするバリデーション。

独自バリデーションを追加する機会が殆どなかったですが、
ブロック変数をモデル名と一致させることで個人的には可読性が高い書き方です。

validate do |book|
  if book.name.include?('exercise')
    book.errors[:name] << 'I don\'t like exercise.'
  end
end

variantsによるテンプレートの切り替え

自作アプリではCSSレスポンシブフレームワークを使っていて
ここらへんを意識したことがなかった。

Railsではrequest.variantに :tablet や :mobile などを定義し、
『アクション名.html+定義したシンボル名.erb』を作成することで
ユーザーのアクセスに応じて簡単にビューを切り替えることが可能なようです。

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :detect_mobile_variant
   private
    def detect_mobile_variant
      request.variant = :mobile if request.user_agent =~ /iPhone/
    end
end

その他

既知の知識だったため割愛しますが、2章では以下にも触れていました。
気になる方は本を手にとって見てはどうでしょうか?
パーフェクトRuby on Rails

  • ActiveRecord enums
  • resources, member/collectionの違い, resource
  • StrongParameters
  • html_safeメソッド
  • ビューの出し分け(CSVやJSON)

※パrails2章のリポジトリ

          
    

スポンサーリンク

  
Scroll Up