Submit Search
最近のRails事情 - 4.1!
•
11 likes
•
6,934 views
Kenichi Tachibana
Follow
2014/1/15 Hamamatus.rb #35 での発表に使ったスライドです。
Read less
Read more
1 of 19
Download now
Downloaded 13 times
More Related Content
最近のRails事情 - 4.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.
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.
ありがとうございました
Download