週刊Railsウォッチ(20181119)レビューでチェックされる非効率な書き方、Local Storageは使うなほか

こんにちは、hachi8833です。Twitterで流れてきたAmazon Payのエラーページを二度見してしまいました。 Railsじゃんw — ジョーカー 1007 (@joker1007) November 12, 2018 つっつきボイス:「Amazon Payで何ができるのかがそもそも自分が知らないという😆」「やっぱりAmazonでペイするんでしょうね😆」「Railsでさっと作って立ち上げる、王道の使い方🤴」 参考: Amazon Payで簡単で安心なオンライン決済を | Amazon Pay 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話です👄 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください ⚓お知らせ: 週刊Railsウォッチ: 公開つっつき会#5 応募先: 週刊Railsウォッチ 公開つっつき会 第5回|IT勉強会ならTECH PLAY[テックプレイ] 次回の公開つっつき会は12/6(木)に開催いたします。定員を10名に増やしましたので、皆さまのお気軽なご応募をお待ちしております🙇。 ⚓Rails: 先週の改修(Rails公式ニュースより) 公式の更新情報はなかったので、コミットから見繕いました。 ⚓パラメータのparseエラーをrescueできるようにした PR: Allow rescue from parse errors by gmcgibbon · Pull Request #34341 · rails/rails # actionpack/lib/action_controller/metal/params_wrapper.rb#L243 # Performs parameters wrapping upon the request. Called automatically # by the metal call stack. def process_action(*args) if _wrapper_enabled? wrapped_hash = _wrap_parameters request.request_parameters wrapped_keys = request.request_parameters.keys wrapped_filtered_hash = _wrap_parameters request.filtered_parameters.slice(*wrapped_keys) # This will make the wrapped hash accessible from controller and view. request.parameters.merge! wrapped_hash request.request_parameters.merge! wrapped_hash # This will display the wrapped hash in the log file. request.filtered_parameters.merge! wrapped_filtered_hash end – super + ensure + # メモ: すべての例外をrescueするので、 + # ActionController::Rescueでキャッチされるであろう + return super end つっつきボイス:「strong parametersのお話なのかな?」「うーん🤔」「RescueよりParamsWrapperの方が後にincludeされてるから、PramsWrapperでraiseしてもRescueにキャッチされない状態だったんですね」「やや、なるほど!」 「お、改修箇所↑のprocess_actionでensureしてからreturn superしてるのが気になる👁: こういう書き方ってアリ?🐜」「むむ?」「このparams_wrapper.rbを見てみると他にもsuperだらけですね」「これはラッパーなんでsuperいっぱいなのは不思議ではない🤓」 「しかしエラーになってもならなくても常にreturn super…?: エラー握りつぶしだとしたら一般には悪手っぽいんだけどな〜😅」「Rubyスタイルガイドをチェックするとensureブロックでは結果を返さないこと」という記述がありますね↓」 ensureブロックで返した結果は、raiseされる例外より優先されてしまいます。これでは例外が発生してない場合と区別できなくなってしまい、例外が警告なしで捨てられてしまいます。 Rubyスタイルガイドを読む: 例外処理 「そう、業務コードならensureでreturnするもんじゃない: けどこれはフレームワークのコードなんで、ちょっとトリッキーではあるけどensureでreturn superすることには意味がある」「そっか、常に最後にsuperすることが前提だからか」「superは必ず実行したいけど、例外も吐きたい、でも例外を吐いたときにスーパークラスのprocess_actionが呼ばれないのは困ると」「ふんわり見えてきた気が🙄」「やりたいのはensureでsuperすることで、returnは書かなくてもいいような気はするんだけど🤔、あ、成功時にsuperの結果を返したいってことかな?」 「わからなくなってきたので、ちょっとensureの挙動をチェックしたろ↓」 def hoge ‘hoge’ ensure 42 end hoge #=> hoge def huga ‘huga’ ensure return 42 end huga #=> 42 「おう、returnしないと正常値のhogeが返るけど、returnするとhugaが出なくなるし」「ということは」「結局さっきの改修は、正常時にはsuperの結果を返し、エラー時にもsuperの結果を返すようにすると: スゲー書き方🤓」「何だかスゲー」「だから明示的にreturnを書かないといけないのか: そしてsuper呼ぶ前にmerge!やら何やら破壊的な前処理やってるんで中断すると困っちゃうヤツ」 「begin–endでrescueして書く方法もありそうだけど階層も深くなるし冗長になるし、だからこう修正したんじゃないかな🤔」「普通ならRubocopには怒られるヤツでしょうね」「superと例外の両方の通り道があるのがややこしい😅」 フレームワークならではの書き方で以下の記事↓を思い出しました。 Railsフレームワークで多用される「options = {} 」引数は軽々しく真似しない方がいいという話 「ところでこのParamsWrapperが置かれているmetalってのも気になります」「きっとRailsのルーティングエンジンがjourneyと呼ばれてたみたいなニックネームなんでしょうけど」「お、このステキな記事↓にRails Metalは『Rails 2.3 でcgiからRackベースに変更した際に抽象化レイヤとして導入された』って書いてあるし」 参考: Rails考古学:WebAPIを取り巻く環境の変化とRailsの対応 - Qiita 「つかRails 2.3でRackが導入される以前ってCGIベースだったんですか😳!」「ってことなんでしょうね〜: … Continue reading 週刊Railsウォッチ(20181119)レビューでチェックされる非効率な書き方、Local Storageは使うなほか