Upgrade to Pro — share decks privately, control downloads, hide ads and more …

before action setter いる? / Good-bye "before act...

OSA Shunsuke
September 06, 2018

before action setter いる? / Good-bye "before action setter"

表参道.rb #38 〜Railsアンチパターン〜 でやった LT です。
https://omotesandorb.connpass.com/event/98377/

元ネタ: http://osa.hatenablog.com/entry/good-bye-before-action-setter

OSA Shunsuke

September 06, 2018
Tweet

More Decks by OSA Shunsuke

Other Decks in Programming

Transcript

  1. 自己紹介 • @s_osa_ • OSA Shunsuke • Cookpad Inc. •

    技術部 ユーザー・決済基盤グループ • Rails に対しては愛憎相半ばする複雑な気持ちを抱い ている 2
  2. before action setter 名前がないといろいろ不便なので、勝手に before action setter と呼んでいますが、要は scaffold でも生成されるこいつ。

    class HogesController < ApplicationController before_action :set_hoge, only: %i[show] private def set_hoge @hoge = Hoge.find(params[:id]) end end 4
  3. action の関心がわかりにくい Rails の controller におけるインスタンス変数は view で 参照する変数であり、レスポンスを組み立てるために必要 なものが入っている。

    インスタンス変数が暗黙的に代入されると、その action の関心が何なのかが少なくともパッとはわからない。 8
  4. シンプルなとき そのまま書けば良い。 class HogesController < ApplicationController def show @hoge =

    Hoge.find(params[:id]) end def edit @hoge = Hoge.find(params[:id]) end # ... end 10
  5. 複雑・重要な絞り込みがあるとき 具体的には、複雑だったり重要だったりする絞り込みを行なっていて、その重複を避けたい場合。 そういうときは set_* じゃなく find_* する。 class HogesController <

    ApplicationController def show @hoge = find_hoge(params[:id]) end private # @param id [String] # @return [Hoge] def find_hoge(id) Hoge.very.complex.condtion.find(id) end end 11
  6. 順序依存性があるとき 複数の before action setter の間に順序依存性があったケースでは依存を明確にして管理するために引数として渡す。 class HogesController < ApplicationController

    def show @hoge = find_hoge(params[:id]) @fuga = find_fuga(@hoge) end private # @param id [String] # @return [Hoge] def find_hoge(id) Hoge.very.complex.condtion.find(id) end # @param hoge [Hoge] # @return [Fuga] def find_fuga(hoge) hoge.fugas.very.important.condition.first end end 12
  7. 認証・検証など • action が呼ばれる際に満たしておく事前条件のようなものが存 在し、その条件を満たさないときは action を実行しないような 類のもの。 •authenticate_*! とか

    verify_*! みたいなメソッド名が 多い。 • 別の言い方をすると、before_action の旧名である before_filter という名前がしっくり来る感じのやつ。 •setter じゃないことも多いが、認証・検証後に set することもあ りがち。 14
  8. まとめ • before action setter って必要? • 多くの場合、いらない。 • Rails

    とはいい感じに折り合いをつけて付き合っていきた い。 17