Your SlideShare is downloading. ×
最近のRails事情 - 4.1!
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

最近のRails事情 - 4.1!

5,356

Published on

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

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

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,356
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
13
Comments
0
Likes
11
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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. Preloader組み込みで色々高速起動 railsチーム謹製PreloaderであるSpringがデフォルトで組み込み rails系コマンドの起動の遅さを改善するプログラム 初期化処理の終わったプロセスをあらかじめ立ち上げておく仕組み
  • 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. 注意点 railsとrake以外は別のgemに分離されている Gemfile: gem 'spring' # これは元から書いてある gem 'spring-commands-rspec' # これを追加しよう
  • 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. 秘密の設定値を格納するファイルが標準化 “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. 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. メールのプレビュー機能が組み込まれた #{Rails.root}/test/mailers/previews/notifier_preview.rb に (/test !) class NotifierPreview < ActionMailer::Preview def welcome Notifier.welcome(User.first) end end を置いて
  • 9. http://localhost:3000/rails/mailers previewの一覧が!
  • 10. http://localhost:3000/rails/mailers/notifier/w previewにフォーマットの切り替えまで!(ビューが複数ある場合) paramsは使えないのでpreviewを動的に変える方法は無いかも
  • 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. 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. 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. 属性名を指定するだけで”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. 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. User#to_paramを自分で実装しても良い class User < AR::Base def to_param name end end Rails 4.1以前からあった仕様 上記の場合、controllerではUser.find_by!(name: params[:id])とする
  • 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. その他 Queue APIはまた入らなかった Module#concerningを省略した が、結構大事な気がする モデル内部をグループ化して名前を付ける機能 Product内部をSearchingとPurchasingとReviewingに分類したりする 時間をstubするテストヘルパ#travel, #travel_to が入ったはずだが、RSpecでは使えな い? rake db:test:prepare タスクが消えたらしい テスト実行時に必ず暗黙的にDBをセットアップするようになったらしい 外部キーなど必須のレガシーDBではどうするかまだ調査中
  • 19. ありがとうございました

×