ruby on rails 4.0 勉強会資料

66
Rails4 SUZUKI, Kei

Upload: techscore

Post on 08-Sep-2014

13.942 views

Category:

Technology


1 download

DESCRIPTION

Rails4 社内勉強会の発表資料です。 Blog: http://www.techscore.com/blog/2013/09/09/rails4-%E7%A4%BE%E5%86%85%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88/ (2013/10/03) TECHSCORE 本体に Rails4 の記事を書きました!スライドでは書ききれなかった詳細についても解説していますので、そちらもご覧ください。see http://www.techscore.com/tech/Ruby/rails-4.0/

TRANSCRIPT

Page 1: Ruby on Rails 4.0 勉強会資料

Rails4SUZUKI, Kei

Page 2: Ruby on Rails 4.0 勉強会資料

Table of Contents

1. イントロダクション2. 主な変更点3. 注目機能4. ライブラリの対応状況5. はまりどころ6. 残された課題7. 参考情報8. まとめ

Page 3: Ruby on Rails 4.0 勉強会資料

イントロダクション

Page 4: Ruby on Rails 4.0 勉強会資料

ハイライト

● Ruby2.0推奨、1.9.3以降をサポート● Strong Parameters● Turbolinks● Russian Doll Caching

イントロダクション

Page 5: Ruby on Rails 4.0 勉強会資料

外部ライブラリ化された機能

● 非推奨機能のため○ Hash-based & Dynamic finder methods

● 使用頻度が低いなどの理由で○ Mass assignment protection in Active Record models○ ActiveRecord::SessionStore○ Active Record Observers○ Active Resource○ Action Caching○ Page Caching○ Performance tests

● 疎結合にするため○ Sprockets

イントロダクション

Page 6: Ruby on Rails 4.0 勉強会資料

主な変更点

全体的な変更

Page 7: Ruby on Rails 4.0 勉強会資料

プラグインの廃止

● プラグイン(vendor/plugins)が廃止● バージョンや依存関係の管理に問題があった

主な変更点(全体的な変更)

Rails2 vendor/pluginsRails3 bundler (vendor/plugins)Rails4 bundler

ライブラリ管理がbundlerに一本化された

Page 8: Ruby on Rails 4.0 勉強会資料

テストコードのディレクトリ構成が変更主な変更点(全体的な変更)

Rails3 Rails4unitfunctionalintegrationperformancefixtures

modelsmailershelperscontrollersintegrationfixtures

テストコードの置き場所が明確になった

Page 9: Ruby on Rails 4.0 勉強会資料

concernsディレクトリの導入(1)

● concerns ディレクトリ○ app/models/concerns○ app/controllers/concerns

● 用途○ モデル、コントローラの Mixin 用モジュールを置く場所○ プロジェクトごとにバラバラだった置き場所を統一する

主な変更点(全体的な変更)

共通コードの置き場所が用意された

Page 10: Ruby on Rails 4.0 勉強会資料

concernsディレクトリの導入(2)

● 肥大化したクラスは機能ごとにモジュール分割

主な変更点(全体的な変更)

# app/models/article.rbclass Article < ActiveRecord::Base include Tagging include Ratingend

# app/models/concerns/tagging.rbmodule Tagging # … タグ付けに関するコードend

# app/models/concerns/rating.rbmodule Rating # … レーティングに関するコードend

# app/models/article.rbclass Article < ActiveRecord::Base

# … タグ付けに関するコード

# … レーティングに関するコード

# … その他のコード

end

分割したモジュールの置き場所がconcerns

Page 11: Ruby on Rails 4.0 勉強会資料

index.html の動的生成主な変更点(全体的な変更)

public/index.htmlを消す手間が不要になった

Page 12: Ruby on Rails 4.0 勉強会資料

Not Found ページの改良主な変更点(全体的な変更)

ルーティングのインクリメンタル検索が可能になった

Page 13: Ruby on Rails 4.0 勉強会資料

開発用情報ページの導入(1)主な変更点(全体的な変更)

● /rails/info/routes

ここでもインクリメンタル検索が可能

Page 14: Ruby on Rails 4.0 勉強会資料

開発用情報ページの導入(2)主な変更点(全体的な変更)

● /rails/info/properties

Railsの起動を待たない分、rakeタスクより速い

Page 15: Ruby on Rails 4.0 勉強会資料

内部的な変更主な変更点(全体的な変更)

● デフォルトでスレッドセーフ○ config.threadsafe! は廃止

● ルーティングのパフォーマンス改善○ 内部エンジンがRack::MountからJourneyに変更

● sprocketsのバージョンアップが容易になった○ sprocketsと疎結合になったため

● ActiveSupport::Cache::MemCacheStore○ 依存ライブラリがmemcache-clientからdalliに変更

● ActiveSupport::Cache::Entry の最適化○ メモリ使用量と処理のオーバーヘッドを削減

目に見えない部分も改良されています

Page 16: Ruby on Rails 4.0 勉強会資料

主な変更点

Model

Page 17: Ruby on Rails 4.0 勉強会資料

attr_accessible, attr_protected は非推奨主な変更点(Model)

● protected_attributesとして外部ライブラリ化● 今後はStrongParametersを使用することを推奨

StrongParameters については後述します

Page 18: Ruby on Rails 4.0 勉強会資料

動的なファインダメソッドは非推奨主な変更点(Model)

xxx_by_yyy は where(...) に置き換える

find_all_by_XXX(...) → where(XXX: …)

find_last_by_XXX(...) → where(XXX: …).last

scoped_by_XXX(...) → where(XXX: …)

find_or_initialize_by_XXX(...) → where(XXX: …).find_or_initialize

find_or_create_by_XXX(...) → where(XXX: …).find_or_create または find_or_create_by(XXX: …)

find_or_create_by_XXX!(...) → where(XXX: …).find_or_create! または find_or_create_by!(XXX: …)

Page 19: Ruby on Rails 4.0 勉強会資料

scope には Proc オブジェクトが必須主な変更点(Model)

Procを指定しない書き方(=バグの温床)は禁止

NG scope :recent, where(‘created_at > ?’, 7.days.ago)

OK scope :recent, lambda { where(‘created_at > ?’, 7.days.ago) }

Page 20: Ruby on Rails 4.0 勉強会資料

ActiveModel::Modelモジュール(1)主な変更点(Model)

● Rails3でモデルの機能がモジュール分割され、再利用可能にはなったが・・

再利用するだけで、これだけ書くの?

class YourModel extend ActiveModel::Naming extend ActiveModel::Translation include ActiveModel::Validations include ActiveModel::Conversion

def initialize(params={}) params.each do |attr, value| self.public_send(“#{attr}=”, value) end if params end

def persisted? false endend

Page 21: Ruby on Rails 4.0 勉強会資料

ActiveModel::Modelモジュール(2)主な変更点(Model)

● Rails4では基本的な機能を持つActiveModel::Modelモジュールが用意された

includeするだけで簡単にモデルの機能を再利用可能

class YourModel

include ActiveModel::Model

end

Page 22: Ruby on Rails 4.0 勉強会資料

クエリ API の変更(1)主な変更点(Model)

● all が配列ではなく Relation を返す○ Rails3 では配列を返す○ Rails4 では Relation を返す

(配列が欲しい場合はto_aする)

● pluck は複数カラムを指定可能○ Rails3 では1つのカラムのみ指定可能

● update_column の代わりに update_columns○ update_column は非推奨

● update_attributes は update のエイリアスに○ update_attributes が非推奨となった訳ではない

細かい改良が多くあります

Page 23: Ruby on Rails 4.0 勉強会資料

クエリ API の変更(2)主な変更点(Model)

● where.not で否定条件○ Rails3: where(‘name != ?’, ‘たろう’)○ Rails4: where.not(name: ‘たろう’)

● 再代入せずに(破壊的に)条件を追加○ u = User.all○ u.where!(name: ‘たろう’)○ u.where!(status: ‘有効’)○ u.order!(:created_at)○ u.limit!(777)

細かい改良が多くあります

Page 24: Ruby on Rails 4.0 勉強会資料

クエリ API の変更(3)主な変更点(Model)

● unscopeというexceptより柔軟なメソッドが追加

使用頻度は低いでしょう

# exceptUser.where(name: ‘Taro’, status: ‘OK’).except(:where)

# unscopeUser.where(name: ‘Taro’, status: ‘OK’).unscope(where: :name)

Page 25: Ruby on Rails 4.0 勉強会資料

クエリ API の変更(4)主な変更点(Model)

● 嫌な挙動が直った!

● Rails3だと○ SELECT * FROM users

WHERE name = ‘じろう’;● Rails4だと

○ SELECT * FROM usersWHERE name = ‘たろう’ AND name = ‘じろう’;

scopeのチェインで問題になることが多くありました

class User < ActiveRecord::Base scope :taro, lambda { where(name: ‘たろう’) } scope :jiro, lambda { where(name: ‘じろう’) }endUser.taro.jiro.to_sql

Page 26: Ruby on Rails 4.0 勉強会資料

バリデーション主な変更点(Model)

● validates_absence_of が追加された○ blank? が true であることを検証する

● validates に :strict オプションが追加された○ validates :xxx, …, strict: true○ ActiveModel::StrictValidationFailed が raise される

● ConfirmationValidator のエラーメッセージ○ Rails3: ATTR に設定される○ Rails4: ATTR_confirmation に設定される

ConfirmationValidatorの挙動変更は心の片隅に

Page 27: Ruby on Rails 4.0 勉強会資料

マイグレーション主な変更点(Model)

● 条件付きでリバーシブルになったメソッド○ drop_table, remove_column: 追加情報を与えれば○ change_table: ブロック内で remove などをしなければ

● reversible メソッド○ ブロック内で up/down を行うコードを指定可能

● revert メソッド○ 指定されたマイグレーションを down する

あまり複雑なマイグレーションは書きたくないですね

Page 28: Ruby on Rails 4.0 勉強会資料

主な変更点

View

Page 29: Ruby on Rails 4.0 勉強会資料

.jbuilderテンプレート主な変更点(View)

● views/users/index.json.jbuilder

scaffoldを使うとこのようなコードが生成されます

json.array!(@users) do |user| json.extract! user, :name, :email, :birthday json.url user_url(user, format: :json)end

Page 30: Ruby on Rails 4.0 勉強会資料

.rubyテンプレート主な変更点(View)

● views/users/index.html.ruby

● render :text => ‘ものすごく長い文字列’○ という場合は View に分割しましょう

ポイントはControllerでViewの仕事をしすぎない

‘<p>Hello</p>’

Page 31: Ruby on Rails 4.0 勉強会資料

HTML5 用のヘルパーメソッド主な変更点(View)

● week_field● month_field● datetime_field● datetime_local_field● color_field● time_field● date_field● highlight

ブラウザごとに対応しているタグは異なるので注意

week_field

color_field

Page 32: Ruby on Rails 4.0 勉強会資料

主な変更点

Controller

Page 33: Ruby on Rails 4.0 勉強会資料

フィルタのメソッド名が変更主な変更点(Controller)

xxx_filter から xxx_action に変更

before_actionafter_actionaround_action

before_filterafter_filteraround_filter

Page 34: Ruby on Rails 4.0 勉強会資料

ルーティングの concern主な変更点(Controller)

同じルーティングは concern にまとめる

concern :confirmable do post :confirmend

resources :users, concern: :confirmableresources :articles, concern: :confirmable

resources :users do post :confirmend

resources :articles do post :confirmend

Page 35: Ruby on Rails 4.0 勉強会資料

主な変更点

ActiveSupport

Page 36: Ruby on Rails 4.0 勉強会資料

● Inflection(単数形/複数形の変換)の国際化○ singularize, pluralize の引数にロケールを指定可能

● Object#try, Object#try!○ Object#try はメソッドがない場合に nil を返すように変更○ Object#try! は NoMethodError を raise する

ActiveSupport主な変更点(ActiveSupport)

他にも色々、細かい変更が多い

Page 37: Ruby on Rails 4.0 勉強会資料

注目機能

Turbolinks

Page 38: Ruby on Rails 4.0 勉強会資料

Turbolinksとは注目機能(Turbolinks)

● リンクのクリックをAjaxリクエストに変換○ レスポンスからページの <body> 内を置き換える○ <title> など <head> 内の一部も書き換える

● <head> 内が変わらない場合に効果的○ CSS や Javascript の読み直しが発生しない

● Ajax って戻るボタンに弱い?○ HTML5 の History API を利用し、戻るボタンにも対応

<head> 内がどのページでも同じ場合に有効

Page 39: Ruby on Rails 4.0 勉強会資料

注意点注目機能(Turbolinks)

● デフォルトで有効○ 使わない場合は明示的に無効化する必要がある

● Javascript イベントのタイミングが変わる○ Javascript イベントのタイミングが変わる○ 外部の Javascript ライブラリを使う場合も注意

使うときはポイントを押さえて!

Page 40: Ruby on Rails 4.0 勉強会資料

注目機能

StrongParameters

Page 41: Ruby on Rails 4.0 勉強会資料

StrongParametersとは注目機能(StrongParameters)

● モデルの一括代入問題の対策● 必要なリクエストパラメータだけ受け取る仕組み

Rails4ではattr_accessibleではなくStrongParameters

Page 42: Ruby on Rails 4.0 勉強会資料

StrongParametersの使い方注目機能(StrongParameters)

scaffold が生成するコードを見ると分かりやすい

class UsersController < AplicationController

def create @user = User.new(user_params) … end

def user_params params.require(:user).permit(:name, :email) end

end

Page 43: Ruby on Rails 4.0 勉強会資料

attr_accessibleとの比較注目機能(StrongParameters)

● attr_accessibleはモデルに一括代入可能な属性を制御する

● StrongParametersはリクエストとして受け取るパラメータを制御する

意図しない属性の書き換えを防ぎたい気持ちは同じ

Page 44: Ruby on Rails 4.0 勉強会資料

モデルの仕事、コントローラの仕事注目機能(StrongParameters)

attr_accessibleは問題を解決する場所を間違えていた

● モデルの仕事は自身の一貫性を保つこと○ その画面では変更できない属性が何か、までは知らない

● コントローラの仕事は View とモデルの橋渡し○ Viewからの入力をモデルに渡す○ 表示すべきデータを View に渡す

Page 45: Ruby on Rails 4.0 勉強会資料

● モデルの一括代入問題○ コントローラで解決すべき問題○ StrongParametersを使って解決する

StrongParametersを使いましょう注目機能(StrongParameters)

詳しい使い方は TECHSCORE BLOG へ

Page 46: Ruby on Rails 4.0 勉強会資料

注目機能

ActionController::Live

Page 47: Ruby on Rails 4.0 勉強会資料

ActionController::Liveとは注目機能(ActionController::Live)

● サーバ側からリアルタイムPush通知○ 別スレッドで少しずつレスポンスを返す○ Transfer-Encoding: chunked○ Server-Sent Events などが可能になる

● ストリーミングに対応したサーバが必要○ OK: Puma, Unicorn, Rainbows!○ NG: WEBrick, Thin

● 大量コネクションに耐えるサーバが必要○ マルチプロセス(1プロセス1リクエスト)方式だと厳しい○ マルチスレッド方式のほうが好ましい○ Puma, Rainbows! などが候補

サーバ側からリアルタイムPush通知する機能

Page 48: Ruby on Rails 4.0 勉強会資料

コントローラの実装例注目機能(ActionController::Live)

class SampleController < ApplicationController

include ActionController::Live

def stream response.headers[‘Content-Type’] = ‘text/event-stream’

10.times do |i| response.stream.write(“data: Hello\n\n”) sleep 1 end ensure response.stream.close end

end

Page 49: Ruby on Rails 4.0 勉強会資料

レスポンスの確認注目機能(ActionController::Live)

$ curl -i http://localhost:3000/streamHTTP/1.1 200 OKX-Frame-Options: SAMEORIGINX-XSS-Protection: 1; mode=blockX-Content-Type-Options: nosniffX-UA-Compatible: chrome=1Content-Type: text/event-streamCache-Control: no-cacheSet-Cookie: request_method=GET; path=/X-Request-Id: 6ef6eae2-e9d3-45ed-b993-5893cb75fbb3X-Runtime: 0.024241Transfer-Encoding: chunked

event: messagedata: Hello 1

event: messagedata: Hello 2

event: messagedata: Hello 3

event: donedata: done

Page 50: Ruby on Rails 4.0 勉強会資料

Viewの実装注目機能(ActionController::Live)

var eventSource = new EventSource(“/sample/stream”);

eventSource.addEventListener(“message”, function(event) { // event.data に受信したメッセージが入っている alert(event.data);});

eventSource.addEventListener(“done”, function(event) { eventSource.close();});

Page 51: Ruby on Rails 4.0 勉強会資料

使いどころ注目機能(ActionController::Live)

● リアルタイムPush通信と言えばチャットですが…● 長時間かかるインポート処理の進捗● Twitter や Facebook のタイムライン● Google Maps 上に表示する位置情報

アイディア次第で面白いことができるかも

Page 52: Ruby on Rails 4.0 勉強会資料

マルチスレッド対応

Page 53: Ruby on Rails 4.0 勉強会資料

マルチスレッド方式へマルチスレッド対応

● Webサーバ○ Unicorn から Puma

● 非同期処理ライブラリ○ Resque/Delayed_Job から Sidekiq

マルチプロセス方式からマルチスレッド方式へ

Page 54: Ruby on Rails 4.0 勉強会資料

メリット、デメリットマルチスレッド対応

● メリット○ リソース効率向上○ パフォーマンス向上

● デメリット○ マルチスレッドを意識したコーディングが必要

マルチスレッド方式へ移行すべき?

Page 55: Ruby on Rails 4.0 勉強会資料

ライブラリの対応状況

Page 56: Ruby on Rails 4.0 勉強会資料

だいたい大丈夫ライブラリの対応状況

● 外部ライブラリ○ [OK] unicorn 4.6.3○ [OK] thin 1.5.1○ [NG] mongrel 1.1.5○ [OK] bullet 4.6.0○ [OK] settingslogic 2.0.9○ [OK] rails_config 0.3.3○ [OK] rails4_acts_as_paranoid 0.1.4○ [OK] jpmobile 4.0.0○ [OK] device 1.5.4○ [OK] ssl_requirement 1.4.2○ [OK] kaminari 0.14.1○ [NG] meta_search 0.5.4○ [OK] paperclip○ [OK] exception_notification 4.0.0○ [△] rails_admin 0.5.0○ [NG] typus 3.1.10○ [OK] dynamic_form 1.1.4

● 社内ライブラリ○ [OK] const_enum 1.0.4 (ActiveRecord 定数拡張)○ [OK] easy_model 1.0.4 (DB 非依存モデルのサポート)○ [OK] sys_logger 1.0.0 (Syslog モジュールのラッパー)○ [OK] active_modurality 1.0.1 (モデルの継承機能支援)○ [OK] activerecord-blockwhere 1.0.3 (Arel の where 拡張 DSL)

詳しくは TECHSCORE BLOG へ

Page 57: Ruby on Rails 4.0 勉強会資料

はまりどころ

Page 58: Ruby on Rails 4.0 勉強会資料

● ActiveSupport::TaggedLogging○ クラスからモジュールに変更された。

● ルーティング定義の match○ via オプションで HTTP メソッドの指定が必須になった。

● abstract なモデルの scope○ 正しく動かない問題がある。

はまりどころはまりどころ

詳しくは TECHSCORE BLOG へ

Page 59: Ruby on Rails 4.0 勉強会資料

残された課題

Page 60: Ruby on Rails 4.0 勉強会資料

残された課題残された課題

● 導入が見送られた機能もある○ Job Queue システム○ 非同期処理

● 見送られた理由○ 洗練されきっていない○ 開発者間の合意が十分に取れなかった○ etc...

今後に期待

Page 61: Ruby on Rails 4.0 勉強会資料

参考情報

Page 62: Ruby on Rails 4.0 勉強会資料

参考情報(1)参考情報

● [1] Ruby on Rails Guide (v4.0.0)○ 最新版の Rails Guide です。

● [2] Ruby on Rails 4.0 Release Notes○ Rails4.0 のリリースノートです。

○ 新機能や変更点の概要を知るには一番のページです。

● [3] Upgrading from Rails 3.2 to Rails 4.0○ Rails4.0 へのアップグレードガイドです。

○ 既存プロジェクトを Rails4.0 に移行する場合は必読です。

● [4] GitHub (rails/rails 4-0-stable)○ Rails4.0 のリポジトリです。

○ ソースコードを確認する必要がある場合に参照しましょう。

● [5] rails/actionmailer/CHANGELOG.md○ actionmailer の CHANGELOG です。

○ リリースノートには書かれていない詳細な変更点を知ることができます。

● [6] rails/actionpack/CHANGELOG.md○ actionpack の CHANGELOG です。

○ リリースノートには書かれていない詳細な変更点を知ることができます。

● [7] rails/activemodel/CHANGELOG.md○ activemodel の CHANGELOG です。

○ リリースノートには書かれていない詳細な変更点を知ることができます。

● [8] rails/activerecord/CHANGELOG.md○ activerecord の CHANGELOG です。

○ リリースノートには書かれていない詳細な変更点を知ることができます。

Page 63: Ruby on Rails 4.0 勉強会資料

参考情報(2)参考情報

● [9] rails/activesupport/CHANGELOG.md○ activesupport の CHANGELOG です。

○ リリースノートには書かれていない詳細な変更点を知ることができます。

● [10] rails/railties/CHANGELOG.md○ railties の CHANGELOG です。

○ リリースノートには書かれていない詳細な変更点を知ることができます。

● [11] Rails 4.0: Final version released!○ Rails4.0 のリリースがアナウンスされた Blog エントリです。

● [12] Rails 4.0: Release Candidate 2 released!○ Rails4.0-rc2 のリリースがアナウンスされた Blog エントリです。

● [13] Rails 4.0: Release Candidate 1 released!○ Rails4.0-rc1 のリリースがアナウンスされた Blog エントリです。

● [14] Ruby on Rails API○ 最新版の API リファレンスです。

● [15] Rails 4 Countdown to 2013○ Rails4.0 が開発中の頃から注目機能をまとめられているサイトです。

○ 公式リリース後の内容に沿って注釈が丁寧に入れられています。

● [16] EdgeRails.info○ Rails の最新の開発状況のサマリーを毎週まとめているサイトです。

● [17] WEB+DB PRESS vol.73○ Rails4.0 の分かりやすい特集が組まれています。

● [18] Rails4 ライブラリ対応状況調査

○ 主要ライブラリの Rails4 対応状況の調査結果をまとめています。

Page 64: Ruby on Rails 4.0 勉強会資料

参考情報(3)参考情報

● [19] Rails4 の Strong Parameters でリクエストパラメータを検証する

○ Rails4.0 の注目機能の一つ、 Strong Parameters についてまとめています。

● [20] Ruby on Rails 4.0 Release Notes を読む

○ Rails4.0 のリリースノートの内容をまとめています。

● [21] Put chubby models on a diet with concerns○ DHH によるconcerns の解説です。

● [22] Edge Rails: PATCH is the new primary HTTP method for updates○ リソースの更新を PUT ではなく PATCH で行うことに関するエントリです。

Page 65: Ruby on Rails 4.0 勉強会資料

まとめ

Page 66: Ruby on Rails 4.0 勉強会資料

まとめまとめ

● Rails4 は既に使えるレベル○ Rails4 で開発中の新規案件もあります。

● Rails を使う以上、立ち止まってはいけない○ Railsは「今」の「最善」を追及するフレームワーク

● 新機能は使えばいいってもんじゃない○ Turbolinks を使う場合は慎重に○ StrongParameters は積極的に使いましょう

Enjoy Rails4 !!