最近のRails事情 - 4.1!
author: ‘@ke_tachibana’
about: gem ‘rails’, ‘4.1.0.beta1’
generated_by: ‘slideshow(s9) gem (https://gith...
Preloader組み込みで色々高速起動
railsチーム謹製PreloaderであるSpringがデフォルトで組み込み
rails系コマンドの起動の遅さを改善するプログラム
初期化処理の終わったプロセスをあらかじめ立ち上げておく仕組み
対応するコマンド
rails, rake, rspec, cucumber, testunitあたり
つまり、このへんが高速起動する(2回目から)
rails console
rails generate
rake db:migrate
rak...
注意点
railsとrake以外は別のgemに分離されている
Gemfile:
gem 'spring' # これは元から書いてある
gem 'spring-commands-rspec' # これを追加しよう
使い方
$ spring binstub rspec # ./binにrspecコマンドが出来る
$ bin/rspec # bundle execとspringを通してrspecを実行する

railsコマンドはbin/を付けなくても良い模様...
秘密の設定値を格納するファイルが標準化
“config/secrets.yml”
development:
secret_key_base: 3b7cd727ee24e8444053437c36cc66c3 #=> これはRails標準のキー
...
Viewのバリエーションを自動切り替え
samples_controller.rb:
before_action do
request.variant = :tablet if request.user_agent =~ /iPad/
end
...
メールのプレビュー機能が組み込まれた
#{Rails.root}/test/mailers/previews/notifier_preview.rb に (/test !)
class NotifierPreview < ActionMaile...
http://localhost:3000/rails/mailers

previewの一覧が!
http://localhost:3000/rails/mailers/notifier/w

previewにフォーマットの切り替えまで!(ビューが複数ある場合)
paramsは使えないのでpreviewを動的に変える方法は無いかも
ちなみに
ダミーSMTPというアプローチも (Rails 4.1とは関係ないが)

ダミーSMTPソフト
SMTPを受け入れるが中継する代わりに自分で保持するサーバー。Webやメーラーなどで表示で
きる。
MailCatcher http://...
ActiveRecordにenumフィールドが
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
conversation.archi...
misc
DBのカラム型はinteger
複数の属性が同じ名前の項目を持つときは多分困る
active, vote_activeなどとstatus名を分ける必要がある
定義はHashでも良い。むしろ明示した方が良い?
class Convers...
属性名を指定するだけで”pretty”なURLが作れる
class User < ActiveRecord::Base
to_param :name
end

index.erb:
<% user = User.new(name: 'mynam...
activerecord/lib/active_record/integration.rb:
def to_param(method_name)
define_method :to_param do
if (default = super())...
User#to_paramを自分で実装しても良い
class User < AR::Base
def to_param
name
end
end

Rails 4.1以前からあった仕様
上記の場合、controllerではUser.find_b...
便利メソッド追加(ActiveSupport)
マッチする文字を削除する String#remove
'My name is FOO'.remove(/s/) # => 'MynameisFOO'

Dateが属する週、月、四半期、年の範囲をR...
その他
Queue APIはまた入らなかった
Module#concerningを省略した
が、結構大事な気がする
モデル内部をグループ化して名前を付ける機能
Product内部をSearchingとPurchasingとReviewingに分...
ありがとうございました
Upcoming SlideShare
Loading in …5
×

最近のRails事情 - 4.1!

6,429 views

Published on

2014/1/15 Hamamatus.rb #35 での発表に使ったスライドです。

Published in: Technology
  • Be the first to comment

最近のRails事情 - 4.1!

  1. 1. 最近のRails事情 - 4.1! author: ‘@ke_tachibana’ about: gem ‘rails’, ‘4.1.0.beta1’ generated_by: ‘slideshow(s9) gem (https://github.com/slideshow-s9/slideshow)’
  2. 2. Preloader組み込みで色々高速起動 railsチーム謹製PreloaderであるSpringがデフォルトで組み込み rails系コマンドの起動の遅さを改善するプログラム 初期化処理の終わったプロセスをあらかじめ立ち上げておく仕組み
  3. 3. 対応するコマンド rails, rake, rspec, cucumber, testunitあたり つまり、このへんが高速起動する(2回目から) rails console rails generate rake db:migrate rake routes rake db:seed rspec spec/models/foo.rb 実際1.5秒が0.3秒くらいになった
  4. 4. 注意点 railsとrake以外は別のgemに分離されている Gemfile: gem 'spring' # これは元から書いてある gem 'spring-commands-rspec' # これを追加しよう
  5. 5. 使い方 $ spring binstub rspec # ./binにrspecコマンドが出来る $ bin/rspec # bundle execとspringを通してrspecを実行する railsコマンドはbin/を付けなくても良い模様 rakeコマンドはプロジェクト生成時にbinstubされている模様 direnv (https://github.com/zimbatm/direnv) などを使えば、railsディレクトリに入っ た時だけ./binをPATHに追加したりできる
  6. 6. 秘密の設定値を格納するファイルが標準化 “config/secrets.yml” development: secret_key_base: 3b7cd727ee24e8444053437c36cc66c3 #=> これはRails標準のキー my_api_key: FOOBAR # => 好きなのを追加できる production: my_api_key: <%= ENV['OTHER_API_KEY'] %> #=> これも出来る 取得: Rails.application.secrets.my_api_key # => 'FOOBAR' githubなどに入れることを考えると ダミーにしておく erb記法で環境変数からアクセスする いずれにしてもアプリケーション内での取得方法を統一できる
  7. 7. Viewのバリエーションを自動切り替え samples_controller.rb: before_action do request.variant = :tablet if request.user_agent =~ /iPad/ end 以下を自動選択: app/views/samples /index.html.erb /index.html+tablet.erb misc: index.html.erbは無いと駄目(当然) index.html+smartphone.erbとかは無くても良い(index.html.erbが使われる) 特定のvariantだけredirectとか、もっと細かい制御も可能(詳しくはWebで!)
  8. 8. メールのプレビュー機能が組み込まれた #{Rails.root}/test/mailers/previews/notifier_preview.rb に (/test !) class NotifierPreview < ActionMailer::Preview def welcome Notifier.welcome(User.first) end end を置いて
  9. 9. http://localhost:3000/rails/mailers previewの一覧が!
  10. 10. http://localhost:3000/rails/mailers/notifier/w previewにフォーマットの切り替えまで!(ビューが複数ある場合) paramsは使えないのでpreviewを動的に変える方法は無いかも
  11. 11. ちなみに ダミーSMTPというアプローチも (Rails 4.1とは関係ないが) ダミーSMTPソフト SMTPを受け入れるが中継する代わりに自分で保持するサーバー。Webやメーラーなどで表示で きる。 MailCatcher http://mailcatcher.me/ ($gem install mailcatcher で入るSinatraアプリケーション) FakeSMTP http://nilhcem.github.io/FakeSMTP/ (Java GUIアプリケーション) Mailtrap http://mailtrap.io/ (オンラインのサービス)
  12. 12. ActiveRecordにenumフィールドが class Conversation < ActiveRecord::Base enum status: [ :active, :archived ] end conversation.archived! # statusをarvhivedにする conversation.status = 'archived' # 同じくstatusをarchivedにする conversation.status = 'foo' # ArgumentError: 'foo' is not a valid status conversation.active? # => false statusがactiveかどうか conversation.status # => “archived” 文字列で返される conversation.status_before_type_cast # => 0 DBの生の値 Conversation::STATUS # => { "active" => 0, "archived" => 1 } Conversation.archived # => ActiveRecord::Relation statusがarchivedなものだけのscope
  13. 13. misc DBのカラム型はinteger 複数の属性が同じ名前の項目を持つときは多分困る active, vote_activeなどとstatus名を分ける必要がある 定義はHashでも良い。むしろ明示した方が良い? class Conversation < ActiveRecord::Base enum status: { active: 1, archived: 2 } end whereには数値で与える必要がある Conversation.where(status: 'active').to_sql # => 'SELECT "conversation".* FROM "conversation" WHERE "conversation"."status" = 0' # oh... Conversation.where(status: 1).to_sql # => 'SELECT "conversation".* FROM "conversation" WHERE "conversation"."status" = 1'
  14. 14. 属性名を指定するだけで”pretty”なURLが作れる class User < ActiveRecord::Base to_param :name end index.erb: <% user = User.new(name: 'myname') %> <%= link_to 'Show User', user %> ↓ <a href="/users/1-myname">Show User</a> 先頭にidが付くので、String#to_iの仕様により User.find(params[:id]) はそのまま動く
  15. 15. activerecord/lib/active_record/integration.rb: def to_param(method_name) define_method :to_param do if (default = super()) && (result = send(method_name).to_s).present? "#{default}-#{result.truncate(20, separator: /s/, omission: nil).parameterize}" else default end end end 日本語は消える 20文字以上も消える
  16. 16. User#to_paramを自分で実装しても良い class User < AR::Base def to_param name end end Rails 4.1以前からあった仕様 上記の場合、controllerではUser.find_by!(name: params[:id])とする
  17. 17. 便利メソッド追加(ActiveSupport) マッチする文字を削除する String#remove 'My name is FOO'.remove(/s/) # => 'MynameisFOO' Dateが属する週、月、四半期、年の範囲をRangeで day = Date.new(2014, day.all_week # => day.all_month # => day.all_quarter # => day.all_year # => 1, 15) Mon, 13 Wed, 01 Wed, 01 Wed, 01 Jan Jan Jan Jan 2014..Sun, 2014..Fri, 2014..Mon, 2014..Wed, 19 31 31 31 複数のキャッシュを一度にfetchするfetch_multi Rails.cache.write(:a, 1) Rails.cache.write(:b, 2) Rails.cache.fetch_multi(:a, :b) # => [1, 2] Jan Jan Mar Dec 2014 2014 2014 2014
  18. 18. その他 Queue APIはまた入らなかった Module#concerningを省略した が、結構大事な気がする モデル内部をグループ化して名前を付ける機能 Product内部をSearchingとPurchasingとReviewingに分類したりする 時間をstubするテストヘルパ#travel, #travel_to が入ったはずだが、RSpecでは使えな い? rake db:test:prepare タスクが消えたらしい テスト実行時に必ず暗黙的にDBをセットアップするようになったらしい 外部キーなど必須のレガシーDBではどうするかまだ調査中
  19. 19. ありがとうございました

×