Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Controllerのbefore_actionにおける
インスタンス変数セットについて
自己紹介
名前 : pospome
ブログ : http://d.hatena.ne.jp/pospome/
職種 : サーバサイドエンジニア
rails歴:2 ~ 3ヶ月
before_actionで
インスタンス変数をセットしているコードを
見かけることがある
class UserController < ApplicationController
before_action :set_user
def index()
//何らかの処理
@user.execute
end
private
def se...
before_action で変数をセットする実装が
好きではない
自分ならこう書く
class UserController < ApplicationController
def index()
@user = find_user(100)
@user.execute
end
private
def find_user(id...
before_actionでの変数セットをやめて
action側でprivateな関数を呼び出す
サーバサイドでjsonを返す場合は
インスタンス変数すら不要になるので、
user変数のスコープを狭くできる
class UserController < ApplicationController
def index()
user = find_user(100)
user.execute
render json: user
end
private
...
なぜ、こういった実装をするのか?
before_actionが連続した場合の
変数書き換えを防ぐ
class UserController < ApplicationController
// それぞれで同じ変数を書き換えているかも
// before_action が増えたら、
// 実行順と変数の状態を考慮する必要がある
before_...
before_actionは戻り値を取れないので、
Controller内のインスタンス変数に対して
副作用を与える実装になってしまいがち
action内で明示的に呼ぶことによって
参照透過な実装になる
データの読み込みも処理の一部
action内で明示することによって、
処理の流れがaction内で完結する
before_actionは何をするのか?
actionを実行するかどうかの
バリデーションに利用する
例:権限チェック
可能な限り
before_action同士で依存関係を
持たないようにした方がいい
人によっては
DRYに反していると思うかもしれないが、
action内の関数呼び出しは重複だろうか?
変数のスコープを限定する方が大事だと思う
同じ考えを持つ方々
http://craftingruby.com/posts/2015/05/31/dont-use-before-
action-to-load-data.html
http://blog.ragnarson.com/201...
「Best Practice」らしいが、
コメント欄を確認すると面白い
http://rails-
bestpractices.com/posts/2010/07/24/use-
before_filter/
今回の内容はrailsというよりも
変数のスコープや副作用の話なので、
実はrails関係ない
おわり
ここから発表後の追記です
発表時間が余ったので
before_actionで変数を
セットしている人いますか?
と聞いたところ・・・・
25人中2,3人がセットしているとのこと
before_actionで変数セットするのって
少数派なのかな・・・
だとしたら、
わざわざ取り上げるテーマでもなかった
かもしれない・・・
Upcoming SlideShare
Loading in …5
×

Controllerのbefore_actionにおける インスタンス変数セットについて

4,517 views

Published on

Controllerのbefore_actionにおける インスタンス変数セットについて

Published in: Software
  • Be the first to comment

Controllerのbefore_actionにおける インスタンス変数セットについて

  1. 1. Controllerのbefore_actionにおける インスタンス変数セットについて
  2. 2. 自己紹介 名前 : pospome ブログ : http://d.hatena.ne.jp/pospome/ 職種 : サーバサイドエンジニア rails歴:2 ~ 3ヶ月
  3. 3. before_actionで インスタンス変数をセットしているコードを 見かけることがある
  4. 4. class UserController < ApplicationController before_action :set_user def index() //何らかの処理 @user.execute end private def set_user @user = User.findby(id: 100) end end
  5. 5. before_action で変数をセットする実装が 好きではない 自分ならこう書く
  6. 6. class UserController < ApplicationController def index() @user = find_user(100) @user.execute end private def find_user(id) User.findby(id: id) end end
  7. 7. before_actionでの変数セットをやめて action側でprivateな関数を呼び出す
  8. 8. サーバサイドでjsonを返す場合は インスタンス変数すら不要になるので、 user変数のスコープを狭くできる
  9. 9. class UserController < ApplicationController def index() user = find_user(100) user.execute render json: user end private def find_user(id) User.findby(id: id) end end
  10. 10. なぜ、こういった実装をするのか?
  11. 11. before_actionが連続した場合の 変数書き換えを防ぐ
  12. 12. class UserController < ApplicationController // それぞれで同じ変数を書き換えているかも // before_action が増えたら、 // 実行順と変数の状態を考慮する必要がある before_action :aaa before_action :bbb, only: ['index', 'detail'] before_action :ccc, except: ['index', 'detail'] end
  13. 13. before_actionは戻り値を取れないので、 Controller内のインスタンス変数に対して 副作用を与える実装になってしまいがち action内で明示的に呼ぶことによって 参照透過な実装になる
  14. 14. データの読み込みも処理の一部 action内で明示することによって、 処理の流れがaction内で完結する
  15. 15. before_actionは何をするのか?
  16. 16. actionを実行するかどうかの バリデーションに利用する 例:権限チェック 可能な限り before_action同士で依存関係を 持たないようにした方がいい
  17. 17. 人によっては DRYに反していると思うかもしれないが、 action内の関数呼び出しは重複だろうか? 変数のスコープを限定する方が大事だと思う
  18. 18. 同じ考えを持つ方々 http://craftingruby.com/posts/2015/05/31/dont-use-before- action-to-load-data.html http://blog.ragnarson.com/2015/09/30/problems-with-typical -rails-controllers-and-before-actions.html http://blog.thefrontiergroup.com.au/2014/02/before_action _an_anti_pattern/
  19. 19. 「Best Practice」らしいが、 コメント欄を確認すると面白い http://rails- bestpractices.com/posts/2010/07/24/use- before_filter/
  20. 20. 今回の内容はrailsというよりも 変数のスコープや副作用の話なので、 実はrails関係ない
  21. 21. おわり
  22. 22. ここから発表後の追記です
  23. 23. 発表時間が余ったので before_actionで変数を セットしている人いますか? と聞いたところ・・・・
  24. 24. 25人中2,3人がセットしているとのこと before_actionで変数セットするのって 少数派なのかな・・・ だとしたら、 わざわざ取り上げるテーマでもなかった かもしれない・・・

×