狠狠撸

狠狠撸Share a Scribd company logo
Rails4
SUZUKI, 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/plugins
Rails3 bundler (vendor/plugins)
Rails4 bundler
ライブラリ管理がbundlerに一本化された
テストコードのディレクトリ構成が変更
主な変更点(全体的な変更)
Rails3 Rails4
unit
functional
integration
performance
fixtures
models
mailers
helpers
controllers
integration
fixtures
テストコードの置き場所が明確になった
concernsディレクトリの導入(1)
● concerns ディレクトリ
○ app/models/concerns
○ app/controllers/concerns
● 用途
○ モデル、コントローラの Mixin 用モジュールを置く場所
○ プロジェクトごとにバラバラだった置き場所を統一する
主な変更点(全体的な変更)
共通コードの置き場所が用意された
concernsディレクトリの導入(2)
● 肥大化したクラスは機能ごとにモジュール分割
主な変更点(全体的な変更)
# app/models/article.rb
class Article < ActiveRecord::Base
include Tagging
include Rating
end
# app/models/concerns/tagging.rb
module Tagging
# … タグ付けに関するコード
end
# app/models/concerns/rating.rb
module Rating
# … レーティングに関するコード
end
# app/models/article.rb
class 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
end
end
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より柔軟なメソッドが追加
使用頻度は低いでしょう
# except
User.where(name: ‘Taro’, status: ‘OK’).except(:where)
# unscope
User.where(name: ‘Taro’, status: ‘OK’).unscope(where: :name)
クエリ API の変更(4)
主な変更点(Model)
● 嫌な挙動が直った!
● Rails3だと
○ SELECT * FROM users
WHERE name = ‘じろう’;
● Rails4だと
○ SELECT * FROM users
WHERE name = ‘たろう’ AND name = ‘じろう’;
scopeのチェインで問題になることが多くありました
class User < ActiveRecord::Base
scope :taro, lambda { where(name: ‘たろう’) }
scope :jiro, lambda { where(name: ‘じろう’) }
end
User.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_action
after_action
around_action
before_filter
after_filter
around_filter
ルーティングの concern
主な変更点(Controller)
同じルーティングは concern にまとめる
concern :confirmable do
post :confirm
end
resources :users, concern: :confirmable
resources :articles, concern: :confirmable
resources :users do
post :confirm
end
resources :articles do
post :confirm
end
主な変更点
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: Hellonn”)
sleep 1
end
ensure
response.stream.close
end
end
レスポンスの確認
注目機能(ActionController::Live)
$ curl -i http://localhost:3000/stream
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Content-Type: text/event-stream
Cache-Control: no-cache
Set-Cookie: request_method=GET; path=/
X-Request-Id: 6ef6eae2-e9d3-45ed-b993-5893cb75fbb3
X-Runtime: 0.024241
Transfer-Encoding: chunked
event: message
data: Hello 1
event: message
data: Hello 2
event: message
data: Hello 3
event: done
data: 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 !!

More Related Content

Ruby on Rails 4.0 勉強会資料