サービスクラスにグラフ描画に関する処理を移す

アプリ制作

昨日のエラー

Constraint::PeriodConstraintクラスで, /statistics/activity/period/thisWeekの"thisWeek"の部分が正しいURIになっているか検証するように実装した。

しかしno route matchedエラーが出てしまい、うまく作動していない。原因がわからなかった。

module Constraint
  class SelectPeriodConstraint
    PERIODS = ['thisWeek', 'thisMonth', 'prevWeek', 'prevMonth']

    def matches?(request)
      PERIODS.include?(request.query_parameters['period'])
    end
  end
end

binding.pryで確認してみるとrequest.query_parameters['week_or_month']nilになっていた。requestはActionDispatch::Requestクラスだと分かったので、ドキュメントを確認するとparamsメソッドでURIのセグメントにアクセスできると分かり、解決。

本日実装した機能

  • /statistics/:column/period/:periodで期間を指定してグラフを描画する機能
  • :periodセグメントをRouting時に検証する(RailsGuideのAdvanced Constraintsを使用)
  • Weeklyのグラフ描画時に前後1週間へのリンクを生成する機能
  • 表示しているカラム以外の、2つのカラムへのリンクを生成する機能
    • activity, mood, appetiteのうち、 activityを表示している時に残り2つのカラムへの, 同期間のリンクを生成する

Image from Gyazo

どのように実装したか?

サービスクラスとしてGenerateReport::Reportクラス, さらにReportクラスを継承するWeeklyReport, MonthlyReportクラスを作成した。

コントローラでparamsを解析してWeekyかMonthlyで条件分岐をして、それぞれに処理を移した。

それによって、コントローラの肥大化を抑えた。

  • Reportクラスの主な処理
    • リクエスURI:periodセグメントの文字列から始点, 終点の日付をセットする
    • それらの日付とカラムから各日付のカラムの値を取り出す
    • 前週、次週へのURI文字列を生成する
    • 同期間の別カラムへのURI文字列を生成する

参考にしたもの

[SimpleCalender](<https://github.com/excid3/simple_calendar)というgemのコードをGithubで観察した。

「Reportクラスを継承して、Weekly, Monthlyでクラスを継承する」というアイデアはこのgemからトレースしてみた。

このGemはRailsの深いところのメソッドをたくさん使っていて、理解できないところは多かった。

コードを観察したことで、Railsの仕組みを理解したい!みたいなモチベーションが生まれた。