アプリ制作
昨日のエラー
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つのカラムへの, 同期間のリンクを生成する
どのように実装したか?
サービスクラスとしてGenerateReport::Reportクラス, さらにReportクラスを継承するWeeklyReport, MonthlyReportクラスを作成した。
コントローラでparamsを解析してWeekyかMonthlyで条件分岐をして、それぞれに処理を移した。
それによって、コントローラの肥大化を抑えた。
- Reportクラスの主な処理
参考にしたもの
[SimpleCalender](<https://github.com/excid3/simple_calendar)というgemのコードをGithubで観察した。
「Reportクラスを継承して、Weekly, Monthlyでクラスを継承する」というアイデアはこのgemからトレースしてみた。
このGemはRailsの深いところのメソッドをたくさん使っていて、理解できないところは多かった。
コードを観察したことで、Railsの仕組みを理解したい!みたいなモチベーションが生まれた。