メドピア開発者ブログスマートフォン用の表示で見るメドピア開発者ブログ集合知により医療を再発明しようと邁進しているヘルステックリーディングカンパニーのエンジニアブログです。Tumblrこんにちは。メドピアのRuby(Rails)化をお手伝いしている@willnetです。Ruby化のプロジェクトが始まって1年が過ぎました。新しいメンバーも入り、Railsのコード量は日に日に多くなっています。可読性を保ちつつアプリケーションを大きくしていくために、使える知見をチームメンバーに効率よく伝えていくのが大事だと感じる今日このごろです。普段メドピア内ではコードレビューや社内勉強会などで知識のシェアを行っています。そんなとき、ブログ記事や書籍などのまとまった文章があると「これ読んでおいて」と言うだけで良くなるので楽です。objectを使ったほうがいいですよーという内容でレビューコメントをつけようとしたところ、日本語で詳しくまとまった文章が見当たりませんでした><なければ自分で書くしかありません。objectについてまとめたいと思います。Record以外のオブジェクトを渡すデザインパターンです。objectと呼びます。利点は大きく次の2点です。object内に集めることができ、凝集度を高められる具体例を見ていきましょう。5.1.0でサービス管理者にフィードバックを返すフォームを作ってみます。フィードバック内容をデータベースに保存したい場合、素直に書くと次のようになるでしょう*2。%>ここでフィードバックをデータベースに保存せずに、サービス管理者へメールを送信するようにコードを変更してみましょう。データベースに保存しないので、ApplicationRecordを継承したモデルは使用しません。したときにこんな感じのコードを書いてしまう人が多いのではないでしょうか。%>少し乱雑なコードになりました。コントローラにロジックを記述してしまっています。独自のお作法でフォームを作成したため、ビューとコントローラを両方読まないとどのように動くのか、すぐに理解することができなくなりました。コントローラで@error_messagesという変数を利用していますが、どのような形式で情報が格納されているのか、どのように使用したらいいのかはビューとコントローラ両方を読まないと判断できません。今回の例は項目数が少なく簡単なため、この程度であれば問題ないと判断する方もいるかもしれません。フォームの入力項目数が増えたり種類(セレクトボックス、チェックボックス、ラジオボタン)が増えたときのことを想像してみてください。コントローラが肥大化して読みづらくなり、ビューにどんなときに何が描画されるのかもわかりづらく、修正するのが大変になりそうですね。objectを利用してみます。objectとして、ActiveModel::Modelをincludeしたクラスを用意します。RecordからDBに依存する部分を除いた振る舞いを提供しているライブラリです。Recordを利用したときと同じような記述をすることができます。コードを見てみましょう。Recordを利用した例と全く同じコードになりました。Recordを利用した場合と同じお作法でビューとコントローラを記述することができて大変便利です。個人的には、form_withでは必ずmodelオプションを利用する(form_tagを使わずにform_forを使う)という規則をチーム内に作ってしまってもよいのではないかと考えています。Recordを使わないフォームでだけ利用する」という理解をしてしまう方が多いのではないでしょうか。Recordを利用する場合にも使えます。次のようなUserモデルがあるとします。endendよくある形だと思いますが、passwordのバリデーションやコールバックは、ユーザ作成時以外は必要のないものです。emailのバリデーションもユーザ作成時とメールアドレス変更時だけ必要なものなので、常に必要というわけではありません。objectを利用してUserモデルに書かれたロジックを外出しすることができます。has_secure_passwordendUserモデルがスッキリしましたね。objectを活用することができます。objectにActiveModel::Modelをincludeしてきました。簡単なコード例なのでこれで十分だと思いますが、実際の現場でのコードはもっと複雑になります。Modelだけだと少し面倒に思う部分も出てくるはずです。objectに、サービス運営側からのダイレクトメールを受け取るか否かのチェックボックスを追加したとしましょう。Railsのビューヘルパーであるcheck_boxメソッドはチェックした場合は文字列の"1"、チェックしない場合は"0"がパラメータとして送信されてきます。Recordとは異なり、属性の自動的なキャストは行いません*3。booleanとして扱いたい場合、キャストの処理は自分で書く必要があります。false独自にキャストしないといけない属性の数が多かったり、種類が豊富だったりしたら面倒ですね。objectをバリバリ使ってみたくなった方は一度目を通しておくと良いと思います。objectの利点や使いどころについて一通り解説しました。objectという概念自体は4~5年ほど前から広まっているはずなのですが、日本語でのまとまった文章がないことから、日本ではあまり普及していないような気がします。object普及の一助になって、読みやすいRailsのコードが少しでも増えることを願っています。メドピアでは一緒に働く仲間を募集しています。SREの侘美(たくみ)です。chromeを利用したファイルダウンロードのテスト方法についてこんにちは。メドピアのRuby(Rails)化をお手伝いしている@willn...2019-05-13Ruby2.7の(実験的)新機能「パターンマッチ」で遊ぶはじめまして、メドピアのサーバサイドエンジニアの草分です。chromeへ移行する時に気をつけることこんにちは。月別アーカイブリンク医師専用サイト「MedPeer」エンジニア採用はこちら!スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。