パーフェクト Ruby on Rails 読了

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

 

非常に内容の濃い、いい本でした。
RailsだけにとどまらずChef/Vagrantなどにも言及されていて、めちゃくちゃ読み応えがあります。

以下、自分用メモ。
 

Part1 Rails ~ overview

・1章 Ruby on Railsの概要
・2章 Ruby on RailsMVC
 
ここは大体既に知っていたことなのでさらっと読みました。
(Strong Parametersの説明などちゃんとされています)
ActiveRecort::Relation(p.49) の説明のところは知らなかったです。

* ActiveRecordに対してQuery Interfaceが呼ばれるとActiveReocrd::Relationのインスタンスが生成される
* ActiveRecord::Relationに対して繰り返しQuery Interfaceを呼び出すことができる
* 繰り返し呼び出したQuery IntefaceはActiveRecord::Relationのインスタンスに蓄積され、どんなSQLを発行するかの情報が更新されていく
* 実際にデーガが必要になった時点で、蓄積された情報を基にSQLを発行し、データを取得する

Part2 実践テクニック

・3章 アセット
・4章 Railsのロードパスとレイヤーの定義方法
・5章 開発を効率化するgem
 
この辺りから、読んでよかったありがとうございますな感じになってきます。
3章のアセットはRails始めてやる人は大体ハマるはずなので
こんだけ纏まって書かれていると有り難いはず。
 

Sprockets ディレクティブ一覧(P.100)

基本的にちゃんと知らなかったです。
require_directory(ディレクトリ直下。挿入される順はアルファベット順)/ require_tree(require_directory再帰的)
require_self(複数のディレクティブを記述している時に、自信が読み込まれる順番を指定したい場合に利用する)
など

プリコンパイル対象の追加(P.104)

config.assets.precompile += %w( search.js )

minify無効化

config.assets.js_compress = nil

CoffeScript

-> アロー
=> ファットアロー
と呼ぶのか

CoffeScript SourceMap(P.113)

JSとCoffeeをマッピング gem 'coffee-rails-source-maps', group: [:dvelopment]

3-3. Sass (P.114)

ディレクティブの説明があってめちゃ親切。

3-4. Turbolinks(P.124)

注意事項などピックアップされています。

  • 動作概要、注意点(preventDefault、data-remoteなどは動作しない、グローバル変数要注意)
  • 無効にするにはdata-no-turbolink // apllication.js、gemから削除
  • Turbolinksのイベント一覧
  • jquery-turbolinks Turbolinksの新しいイベント定義とは別に(既存資産を活かすために)jQuery.ready()のイベントハンドラを呼び出してくれるgem
  • インラインjsの実行を抑止(data-tubolinks-eval=false)
  • documentオブジェクトに対するイベント定義はまずい($(document)、data-tubolinks-eval=falseで回避)  
     
    余談ですが、asset piplineからturbolinkの考えに行き着くのは理解できますが
    tubolinkが本当に必要なのかっていうのは個人的には疑問です。
     

    オートローディング(P.131)

  • libディレクトリそのものをautoloads_pathsに突っ込まない方がよい(lib以下にはRakeタスクが存在するため)
autoloads_paths += %W(#{config.root}/lib/autoload)
  • 新しいレイヤーの配置 appディレクトリ以下にサブディレクトリを作成し、autoload_pathsに追加

4-2.レイヤーを追加するgemの例(P.134)

active_decorator、sidekiq ともに初めて触りましたが、よさそうです。

5.開発を効率化するgem

  • pry-rails、pry-byebug
  • better_errors、binding_of_caller これすごくいいです。ブラウザでrepl操作できるとか、びっくりしました。
     

Part3 実践Webアプリケーション開発

・6章 Railsアプリケーション開発
・7章 Railsアプリケーションのテスト
・8章 Railsのインフラと運用
 
ここからチュートリアルです。テストの書き方もしっかりあります。
OAuthを使った実践的な内容で、ominiauth-twitter初めて触りました。
結構Rails触りはじめの頃、チュートリアルやっててcss触るのが面倒だなと思ったのですが
最近はbootstrap使えるのでとても楽ですね。
あと rails g resource って知りませんでした。
 

6-9 落穂ひろい、6-10 gemで機能拡張をする

この辺り、全く知りませんでした。

  • kaminari-bootstrap
  • ransack(モデル検索)
  • carrierwave-magic (mime-typeチェック)
  • mini_magick  

    RSpec install

    rspec-railsが3.0.0だと下記warningとともにエラーとなる。3.0.1だとok。

[WARNING] Could not load generator "generators/rspec/install/install_generator". Error: uninitialized constant RSpec::Support.

 

shoulda-matchers (P.249)

validationを簡潔にする。めっちゃすっきり。

    it { should validate_presence_of(:name) }
    it { should ensure_length_of(:name).is_at_most(50) }

 

factory_girl(P.252)

FactoryGirlの省略。

config.include FactoryGirl::Syntax::Methods

pryのバグ

binding.pryを覚えたので、rspecのdebug時に使っていると下記エラーが表示されていました。

(pry) output error: #<NoMethodError: undefined method `pager' for nil:NilClass>
[2] pry(#<RSpec::ExampleGroups::Nested::Twitter>)> puts page

どうやらpryの最新では問題となるようなので、downgradeして解決。
Pry 0.10.0でundefined method `pager' - PILOG

7.8 poltergeist(P.261)

これも初めてさわりました。phantomJSを利用するテストツール
database_cleaner使ったり、いろいろ必要なのですが、一通り説明してくれてます。
 

Part4 一歩先行くRails

・9章 より実践的なモデルの使い方
・10章 Railsを拡張する
 
Concernに関する内容やRailsの拡張の話は、読み応えありました。
 

9.2 EachValidatorクラス (P.338)

ActiveModel::Validator(P.340)

9.3 ActiveModel (P.343)

9.4 値オブジェクト composed_of(P.356)

使ったことなかったですが、いろんなところで使えそうです。

9.5 Concern (P.358)

Module#concerning

ある程度の規模を持った一連の振舞に対して、その部分を抽出するような場合

Rack Middleware

Railtie

Railsのコアを拡張、Rakeタスク、Rack Middlewareを追加

Engine

RailsアプリのMVCの一部を切り出す

Mountable Engine

Engine + Railsアプリとして必要となる機能を内包