Ruby on Rails 4.0 勉強会資料
-
Upload
techscore -
Category
Technology
-
view
13.942 -
download
1
description
Transcript of Ruby on Rails 4.0 勉強会資料
Rails4SUZUKI, Kei
Table of Contents
1. イントロダクション2. 主な変更点3. 注目機能4. ライブラリの対応状況5. はまりどころ6. 残された課題7. 参考情報8. まとめ
イントロダクション
ハイライト
● Ruby2.0推奨、1.9.3以降をサポート● Strong Parameters● Turbolinks● Russian Doll Caching
イントロダクション
外部ライブラリ化された機能
● 非推奨機能のため○ 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
イントロダクション
主な変更点
全体的な変更
プラグインの廃止
● プラグイン(vendor/plugins)が廃止● バージョンや依存関係の管理に問題があった
主な変更点(全体的な変更)
Rails2 vendor/pluginsRails3 bundler (vendor/plugins)Rails4 bundler
ライブラリ管理がbundlerに一本化された
テストコードのディレクトリ構成が変更主な変更点(全体的な変更)
Rails3 Rails4unitfunctionalintegrationperformancefixtures
modelsmailershelperscontrollersintegrationfixtures
テストコードの置き場所が明確になった
concernsディレクトリの導入(1)
● concerns ディレクトリ○ app/models/concerns○ app/controllers/concerns
● 用途○ モデル、コントローラの Mixin 用モジュールを置く場所○ プロジェクトごとにバラバラだった置き場所を統一する
主な変更点(全体的な変更)
共通コードの置き場所が用意された
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
index.html の動的生成主な変更点(全体的な変更)
public/index.htmlを消す手間が不要になった
Not Found ページの改良主な変更点(全体的な変更)
ルーティングのインクリメンタル検索が可能になった
開発用情報ページの導入(1)主な変更点(全体的な変更)
● /rails/info/routes
ここでもインクリメンタル検索が可能
開発用情報ページの導入(2)主な変更点(全体的な変更)
● /rails/info/properties
Railsの起動を待たない分、rakeタスクより速い
内部的な変更主な変更点(全体的な変更)
● デフォルトでスレッドセーフ○ config.threadsafe! は廃止
● ルーティングのパフォーマンス改善○ 内部エンジンがRack::MountからJourneyに変更
● sprocketsのバージョンアップが容易になった○ sprocketsと疎結合になったため
● ActiveSupport::Cache::MemCacheStore○ 依存ライブラリがmemcache-clientからdalliに変更
● ActiveSupport::Cache::Entry の最適化○ メモリ使用量と処理のオーバーヘッドを削減
目に見えない部分も改良されています
主な変更点
Model
attr_accessible, attr_protected は非推奨主な変更点(Model)
● protected_attributesとして外部ライブラリ化● 今後はStrongParametersを使用することを推奨
StrongParameters については後述します
動的なファインダメソッドは非推奨主な変更点(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: …)
scope には Proc オブジェクトが必須主な変更点(Model)
Procを指定しない書き方(=バグの温床)は禁止
NG scope :recent, where(‘created_at > ?’, 7.days.ago)
OK scope :recent, lambda { where(‘created_at > ?’, 7.days.ago) }
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
ActiveModel::Modelモジュール(2)主な変更点(Model)
● Rails4では基本的な機能を持つActiveModel::Modelモジュールが用意された
includeするだけで簡単にモデルの機能を再利用可能
class YourModel
include ActiveModel::Model
end
クエリ API の変更(1)主な変更点(Model)
● all が配列ではなく Relation を返す○ Rails3 では配列を返す○ Rails4 では Relation を返す
(配列が欲しい場合はto_aする)
● pluck は複数カラムを指定可能○ Rails3 では1つのカラムのみ指定可能
● update_column の代わりに update_columns○ update_column は非推奨
● update_attributes は update のエイリアスに○ update_attributes が非推奨となった訳ではない
細かい改良が多くあります
クエリ 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)
細かい改良が多くあります
クエリ API の変更(3)主な変更点(Model)
● unscopeというexceptより柔軟なメソッドが追加
使用頻度は低いでしょう
# exceptUser.where(name: ‘Taro’, status: ‘OK’).except(:where)
# unscopeUser.where(name: ‘Taro’, status: ‘OK’).unscope(where: :name)
クエリ 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
バリデーション主な変更点(Model)
● validates_absence_of が追加された○ blank? が true であることを検証する
● validates に :strict オプションが追加された○ validates :xxx, …, strict: true○ ActiveModel::StrictValidationFailed が raise される
● ConfirmationValidator のエラーメッセージ○ Rails3: ATTR に設定される○ Rails4: ATTR_confirmation に設定される
ConfirmationValidatorの挙動変更は心の片隅に
マイグレーション主な変更点(Model)
● 条件付きでリバーシブルになったメソッド○ drop_table, remove_column: 追加情報を与えれば○ change_table: ブロック内で remove などをしなければ
● reversible メソッド○ ブロック内で up/down を行うコードを指定可能
● revert メソッド○ 指定されたマイグレーションを down する
あまり複雑なマイグレーションは書きたくないですね
主な変更点
View
.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
.rubyテンプレート主な変更点(View)
● views/users/index.html.ruby
● render :text => ‘ものすごく長い文字列’○ という場合は View に分割しましょう
ポイントはControllerでViewの仕事をしすぎない
‘<p>Hello</p>’
HTML5 用のヘルパーメソッド主な変更点(View)
● week_field● month_field● datetime_field● datetime_local_field● color_field● time_field● date_field● highlight
ブラウザごとに対応しているタグは異なるので注意
week_field
color_field
主な変更点
Controller
フィルタのメソッド名が変更主な変更点(Controller)
xxx_filter から xxx_action に変更
before_actionafter_actionaround_action
before_filterafter_filteraround_filter
ルーティングの 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
主な変更点
ActiveSupport
● Inflection(単数形/複数形の変換)の国際化○ singularize, pluralize の引数にロケールを指定可能
● Object#try, Object#try!○ Object#try はメソッドがない場合に nil を返すように変更○ Object#try! は NoMethodError を raise する
ActiveSupport主な変更点(ActiveSupport)
他にも色々、細かい変更が多い
注目機能
Turbolinks
Turbolinksとは注目機能(Turbolinks)
● リンクのクリックをAjaxリクエストに変換○ レスポンスからページの <body> 内を置き換える○ <title> など <head> 内の一部も書き換える
● <head> 内が変わらない場合に効果的○ CSS や Javascript の読み直しが発生しない
● Ajax って戻るボタンに弱い?○ HTML5 の History API を利用し、戻るボタンにも対応
<head> 内がどのページでも同じ場合に有効
注意点注目機能(Turbolinks)
● デフォルトで有効○ 使わない場合は明示的に無効化する必要がある
● Javascript イベントのタイミングが変わる○ Javascript イベントのタイミングが変わる○ 外部の Javascript ライブラリを使う場合も注意
使うときはポイントを押さえて!
注目機能
StrongParameters
StrongParametersとは注目機能(StrongParameters)
● モデルの一括代入問題の対策● 必要なリクエストパラメータだけ受け取る仕組み
Rails4ではattr_accessibleではなくStrongParameters
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
attr_accessibleとの比較注目機能(StrongParameters)
● attr_accessibleはモデルに一括代入可能な属性を制御する
● StrongParametersはリクエストとして受け取るパラメータを制御する
意図しない属性の書き換えを防ぎたい気持ちは同じ
モデルの仕事、コントローラの仕事注目機能(StrongParameters)
attr_accessibleは問題を解決する場所を間違えていた
● モデルの仕事は自身の一貫性を保つこと○ その画面では変更できない属性が何か、までは知らない
● コントローラの仕事は View とモデルの橋渡し○ Viewからの入力をモデルに渡す○ 表示すべきデータを View に渡す
● モデルの一括代入問題○ コントローラで解決すべき問題○ StrongParametersを使って解決する
StrongParametersを使いましょう注目機能(StrongParameters)
詳しい使い方は TECHSCORE BLOG へ
注目機能
ActionController::Live
ActionController::Liveとは注目機能(ActionController::Live)
● サーバ側からリアルタイムPush通知○ 別スレッドで少しずつレスポンスを返す○ Transfer-Encoding: chunked○ Server-Sent Events などが可能になる
● ストリーミングに対応したサーバが必要○ OK: Puma, Unicorn, Rainbows!○ NG: WEBrick, Thin
● 大量コネクションに耐えるサーバが必要○ マルチプロセス(1プロセス1リクエスト)方式だと厳しい○ マルチスレッド方式のほうが好ましい○ Puma, Rainbows! などが候補
サーバ側からリアルタイムPush通知する機能
コントローラの実装例注目機能(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
レスポンスの確認注目機能(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
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();});
使いどころ注目機能(ActionController::Live)
● リアルタイムPush通信と言えばチャットですが…● 長時間かかるインポート処理の進捗● Twitter や Facebook のタイムライン● Google Maps 上に表示する位置情報
アイディア次第で面白いことができるかも
マルチスレッド対応
マルチスレッド方式へマルチスレッド対応
● Webサーバ○ Unicorn から Puma
● 非同期処理ライブラリ○ Resque/Delayed_Job から Sidekiq
マルチプロセス方式からマルチスレッド方式へ
メリット、デメリットマルチスレッド対応
● メリット○ リソース効率向上○ パフォーマンス向上
● デメリット○ マルチスレッドを意識したコーディングが必要
マルチスレッド方式へ移行すべき?
ライブラリの対応状況
だいたい大丈夫ライブラリの対応状況
● 外部ライブラリ○ [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 へ
はまりどころ
● ActiveSupport::TaggedLogging○ クラスからモジュールに変更された。
● ルーティング定義の match○ via オプションで HTTP メソッドの指定が必須になった。
● abstract なモデルの scope○ 正しく動かない問題がある。
はまりどころはまりどころ
詳しくは TECHSCORE BLOG へ
残された課題
残された課題残された課題
● 導入が見送られた機能もある○ Job Queue システム○ 非同期処理
● 見送られた理由○ 洗練されきっていない○ 開発者間の合意が十分に取れなかった○ etc...
今後に期待
参考情報
参考情報(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 です。
○ リリースノートには書かれていない詳細な変更点を知ることができます。
参考情報(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 対応状況の調査結果をまとめています。
参考情報(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 で行うことに関するエントリです。
まとめ
まとめまとめ
● Rails4 は既に使えるレベル○ Rails4 で開発中の新規案件もあります。
● Rails を使う以上、立ち止まってはいけない○ Railsは「今」の「最善」を追及するフレームワーク
● 新機能は使えばいいってもんじゃない○ Turbolinks を使う場合は慎重に○ StrongParameters は積極的に使いましょう
Enjoy Rails4 !!