学習履歴一覧

150件中の 101-125件 を表示

自作アプリの見た目を整える段階に入ったので、並行してCSS設計の教科書を読み始める。

CSS設計の重要性 「中長期にわたって運用していく中で、コードを無駄に肥大化させずに、思いもよらないバグを招かないようなコードを書く」のが難しい。そのために、誰にでも理解しやすいコードを書く。 デザインカンプ:Design Comprehensive Layout, デザインの完成見本図。 Backbone.js, Knockout.js MCV, MVCC Webでは構造そのものを大きく変更したり、予想外の要素を差し込む、もしくは差し引かなければいけなかったりする。いかにしてメンテナンス効率を下げずに、少ない工数で改修ができるようにするための設計をするか。 より良いCSS 予測しやすい 追加したルールが予想外に他のルールに影響することがない 再利用しやすい 抽象的で機能ごとに分離されている 保守しやすい ルール追加の際にリファクタリングが必要ない 拡張しやすい 誰にとってもメンテナンス・管理しやすい 破綻しやすいCSS HTML構造へ依存している サイトやアプリケーションの機能仕様やデザインが変わると、HTMLの構造に依存しているCSSやJavascriptも変更する必要がある CSSを要素名ではなくクラス名でしていれば、HTMLに変更があっても、CSSは変更せずに済む。 セレクタをHTML要素で深く指定してしまうと、HTMLに変更があった際にセレクタも変更しなければいけなくなる。手間が増える。HTML要素の深いセレクタにしてしまうこともある。 学習したことのメモです。 スタイルを取り消している H1要素のborder-bottomを取り消すためのクラスを追加するのではなく、下線を追加するためのルールを作る。.headlineをつければ下線を引けるし、.headlineを消せば下線が消える。 プロを目指す人のためのRuby入門 本日で1周することができた。アプリ制作と並行して学習したことで、覚えたことを制作で使う場面が何度もあった。 その中で成長した点は、 - StackOverflowを理解しやすくなり、解決策を自作中のアプリの状況に合わせながら組み込む経験を何度もできた こと だと考えている。

Ruby
Rails

2019年10月25日(金)

2.0時間

Chart.jsにToggle機能を追加しカラムの表示/非表示を切り替える

実現したい機能を表す言葉を知らなかったこと。メンターから教えていただいた記事にToggleという言葉があり, それを検索すると, デモにたどり着くことができた。

実現したいこと 体調グラフ機能, ボタンのON/OFFでカラムの表示/非表示を切り替える メンターから, Ajaxは学習コストが高いのでjQueryでやった方が早くできるとアドバイスを頂いた。 各カラムのボタンのtoggleによって, 対応するdatasetを追加したり、削除したりできるようにしたい。 どう実装するのか? この記事についているデモの通りに実装していく。 How to add a dataset toggle to Chart.js? 大まかな流れは、 ToggleするリンクをHTML作成し, class名をカラム名 + enabledとする JavascriptでenableCheck関数を作成 各カラムのクラス名にenabledが付いているかを判定 trueなら変数にグラフのdatasetを代入, falseならnilを代入 jQueryの.readyでenableCheckを実行 リンクをクリック時にグラフを削除し, enableCheckを再度実行した上でグラフ描画を行う 結果 datasetとlabelなどの値は一旦固定にして, Toiggle機能のみ実装した。 次回はRailsで全カラムのデータをブラウザにレスポンスできるようにする。 その他の作業 jQuery 要素を表示/非表示にする(toggle) を参考にボタンのtoggleを試しに作成する プロを目指す人のためのRuby入門 11章 デバッグ技法

Ruby
Rails
Javascript

2019年10月18日(金)

5.5時間

体調グラフ機能で複数カラムを動的に表示する方法を調べる

Ajaxを使用して動的にグラフを描画する方法が分からないこと。
我流で闇雲に学習するよりも, よい教材がないかメンター聞いた方が良いと思い、メンターに質問を送った。

アプリ制作 実現したいこと(1) 複数カラムを選択して同時に描画する. activity, appetite, moodの3カラムのボタンを設置する. 3つのボタンはON/OFFにすることができ、ONの状態にあるカラムをまとめて表示したい。 試したこと Rails Chart.js Dynamically change columnで調べると、Ajaxを使った方法が多く見られた。 Ajaxを使用したことがないので、学習方法をメンターに質問。(進捗報告も兼ねて) 実現したいこと(2) Diaryのカラムごとに色分けをしてグラフを表示する どのように実装するか Chartjs-ror gem を導入し, グラフのUIをRailsで設定できるようにする。 # example data = { labels: ["January", "February", "March", "April", "May", "June", "July"], datasets: [ { label: "My First dataset", backgroundColor: "rgba(220,220,220,0.2)", borderColor: "rgba(220,220,220,1)", data: [65, 59, 80, 81, 56, 55, 40] }, { label: "My Second dataset", backgroundColor: "rgba(151,187,205,0.2)", borderColor: "rgba(151,187,205,1)", data: [28, 48, 40, 19, 86, 27, 90] } ] } options = { ... } <%= line_chart data, options %> dataハッシュ labelsキー: X軸の値 (Array) datasetsキー:単独または複数の datasetハッシュ (Array) datasetハッシュ (ある期間における1カラムのグラフを表す) labelキー : legend name (String) backgroundcolorキー: グラフの背景色, rgba (String) bordercolorキー: グラフの枠線の色, rgba(String) dataキー: Y軸の値(Array) Viewでline_chartメソッドを呼び出し, 引数にdata, optionを代入する 使用したい色 #51a370 rgb(81,162,112) Green Mood #ffeb8a rgb(255,235,138) YELLOW Appetite #e86c4e rgb(232,108,77) Orange Activity その他の作業 期間やカラムの移動に関するリンクをテンプレート化し、app/views/layoutsへ置いた プロを目指す人のためのRuby入門 10章 Procとラムダ(2時間)

Ruby
Rails

2019年10月17日(木)

6.0時間

Weeklyのグラフで前後の期間へのリンクを生成できないエラーをデバッグした。

週間グラフを表示しており、前週へのリンクを2回押すと, 期間が7日以上でグラフが描画されてしまう。
byebugを使って処理を一つずつ確かめていった。詳細については本文参照ください。

アプリ制作 実現したいこと1 リクエストが下の2つのパターン両方でグラフ描画を行えるようにする。前者はコントローラのreport*by*dateアクション, 後者はreport*by*periodアクションにルーティングされている。 statistics/activity/from/2019-10-07/to/2019-10-13, statistics/activity/period/prevWeek 課題1 statistics/activity/period/prevWeekで先週のグラフを表示する。これは2019-10-07/to/2019-10-13の期間のグラフが表示できている。 (1) 次に前週へのリンクを押し, 2019-09-30 ~ 2019-10-06の期間のグラフを表示する。しかし、この期間のレコードは存在するのにグラフには該当日付のY軸の値が表示されない。 (2) そのまたさらに前週へのリンクを押すと, 本来は2019-09-23 ~ 2019-09-29の期間がリクエストされるはずにもかかわらず, 2019-08-01 ~ 2019-09-29の期間がリクエストされる。 課題1がなぜ起こるのか?・修正すべき点と結果 binding.pryでコントローラの@reportが正しく生成されているか確認をした。 2019-09-30 ~ 2019-10-06の期間, つまり1週間でリクエストをしているのに、MonthlyReportクラスが呼ばれていた。(期間が1ヶ月単位の時に呼び出すように設計したつもりだった) リクエストされた期間に対して, コントローラ内でWeeklyReportかMonthlyReportかを条件分岐する部分が意図した通りに機能していない。その部分を修正する必要がある。 コントローラではis_date_weekly?メソッドでtrueならWeeklyReport, falseならMonthlyReportを生成するように分岐させていた。2019-09-30 ~ 2019-10-06のリクエストに対して, このメソッドでfalseを返してしまい, MonthlyReportが生成されてしまっていた。 def is_date_weekly?(date_begin, date_end) (date_begin..date_end).to_a.length <= 7 ? true : false end なぜそうなるかというと、メソッドの引数date_begin, date_endがStringクラスのまま代入されていた。Dateオブジェクトに変換するように修正すると, WeeklyReportを生成できた。 さらに発生した懸念点 MonthlyReportクラスではgroup_by_monthで月初の日付をキーにしてグループ化したハッシュを作成している。そのためdate_beginが月初の日付でないと, 該当期間のY軸の値をすべてnilにして配列で返してしまう. (この,keyが見つからない場合にnilの配列を返す処理は, Diaryレコードがない期間のリクエストの際にエラー発生を防ぐ目的で実装していた。) def data_generator(user, column, date_begin) records = user.diaries.group_by_month(&:diary_date) if records[date_begin].present? records[date_begin].map do |diary| diary.send(column) end elsif records[date_begin].nil? date_range.length.times.map { |n| nil } else raise "Error" end グループしたHashのキーが存在しなかった場合, 該当期間のY軸がすべてnilになる可能性がある。group_byメソッドの処理を確認したり、Reportクラスの処理を修正する必要があるなと思った。 実現したいこと2 同じカラムで週間→月間, 月間→週間の遷移をする どのように実装したか? 週間→月間 WeeklyReportクラスにto_monthlyメソッドを作成 date_beginのbeginning_of_month, end_of_monthを取得して, URI文字列を返す 月間→週間 MonthlyReportクラスにto_weeklyメソッドを作成 date_beginとdate_endの日数の差の2分の1の日付を基準日にし、基準日の週の月曜, 日曜をそれぞれdate_begin, date_endにセット URI文字列を返す Viewで@reportがWeekly, Monthlyどちらのクラスのインスタンかを確かめる #app/views/statistics/report_by_date.html.erb <% if @report.class.method_defined? :to_monthly %> <%= link_to "月間", "#{@report.to_monthly}" %> <% end %> <% if @report.class.method_defined? :to_weekly %> <%= link_to "週間", "#{@report.to_weekly}" %> <% end %> 実装できた。 ここまでに実装した機能(体調グラフ) URIの形式 期間を表す単語で期間を指定する /statistics/:column/period/thisWeek - 単語は4種類 [thisWeek, thisMonth, prevWeek, prevMonth] - PeriodConstaraintクラスでリクエストのURIをこれら4種類のみに限定 - 日付で期間を指定 /statistics/:column/from/:date_begin/to/:date_end - DateConstraintクラスで日付を表す文字列かどうかを検証 期間は週間、月間の2週類 それぞれの期間について、以下のことができる. 前後の期間へのリンクを生成する機能(同カラム内) 週間→月間、月間→週間へのリンクを生成する機能(同カラム内) 同期間内で異なるカラムへのリンクを生成する機能 プロを目指す人のためのRuby入門 第10章 Procとyieldを理解する(2時間)

Ruby
Rails

2019年10月16日(水)

5.2時間

キーワード引数にデフォルト値を設定し,異なるパターンの引数を取れるようにする

app/controllers/statistics_controller.rbのreport_by_dateアクションで、GenerateReport::WeeklyReport.newした際にArgumentErrorが発生する。
newする際の引数がStatisticsControllerの2つのアクションで異なっており、WeeklyReportクラスがそれに対応できてないことが分か...

アプリ制作 実現したいこと リクエストが statistics/activity/from/2019-10-07/to/2019-10-13, statistics/activity/period/prevWeekの2つのパターン両方でグラフ描画を行えるようにする。前者はコントローラのreport_by_dateアクション, 後者はreport_by_periodアクションにルーティングされています。 実装方法 ~~lib下のDateConstraintクラスでURIの/:datebegin, /:dateendを Date.valid_date?メソッドで検証する(year, month, dayでマッチデータオブジェクトを生成してメソッドに代入)~~ コントローラでparams[:datebegin], params[:dateend]をインスタンス変数にセット コントローラでweekly, monthlyで場合分けしてReportクラスへ渡す PERIODSに該当する場合はリダイレクト? 詰まった部分 app/controllers/statistics_controller.rbのreport_by_dateアクションで、 GenerateReport::WeeklyReport.newした際にArgumentErrorが発生する。 どのように実装してエラーが発生したのか? #lib/generate_report/report.rb module GenerateReport class Report def initialize(user:, column:, period: nil) @user = user @column = column @period = period ? period : nil end end end #lib/generate_report/monthly_report.rb module GenerateReport class WeeklyReport < GenerateReport::Report attr_reader :column, :date_begin, :date_end def initialize(user:, column:, period: nil, date_begin: nil, date_end: nil) super(user, column, period) @date_begin = date_begin ? date_begin : generate_date_begin(period) @date_end = date_end ? date_end : date_begin.end_of_week end # 省略 end end #StatisticsController class StatisticsController < ApplicationController def report_by_date @COLUMNS = { activity: "活動量", mood: "気分", appetite: "食欲" } set_params_when_report_by_date_action(statistics_params) if is_date_weekly?(@date_begin, @date_end) @report = GenerateReport::WeeklyReport.new(user: current_user, column: @column, date_begin: @date_begin, date_end: @date_end) else @report = GenerateReport::MonthlyReport.new(user: current_user, column: @column, date_begin: @date_begin, date_end: @date_end) end binding.pry end end ここで実現したいこと statisticsコントローラのreport_by_periodアクションではWeeklyReport.newの引数がuser, column, period の3つ 同コントローラのreport_by_dateアクションではWeeklyReport.newの引数がuser, column, date_begin, date_end の4つ user, columnは両アクションに共通していて、period, date_begin, date_endは存在すれば代入し、無ければinitialize時に別途セットするようにしたい。 Report, WeeklyReportクラスの初期化時の引数を修正する #lib/generate_report/report.rb class Report attr_reader :column, :period, :date_begin, :date_end def initialize(user:, column:, period: nil, date_begin: nil, date_end: nil) @user = user @column = column @period = period ? period : nil end #省略 end #lib/generate_report/monthly_report.rb class WeeklyReport < GenerateReport::Report attr_reader :column, :date_begin, :date_end def initialize(user:, column:, period: nil, date_begin: nil, date_end: nil) super @date_begin = date_begin ? date_begin : generate_date_begin(period) @date_end = date_end ? date_end : date_begin.end_of_week end #省略 end /statistics/activity/prevWeekのリクエスト時 /statistics/activity/from/2019-10-07/to/2019-10-13のリクエスト時 WeeklyReportクラスでintialize時に引数が異なる場合でも, 共通の処理を提供できるようになった。

Ruby
Rails

2019年10月15日(火)

2.6時間

体調グラフ機能, 該当期間のy軸の値を吐き出すメソッドに例外処理を実装する

アプリ制作 実現したいこと(1) Diaryレコードが存在しない期間を指定した際に、app/lib/generate_report/weekly_report.rb のdata_generatorメソッドでエラーが発生してしまう。レコードが存在しない場合でも値を0としてグラフの描画を行えるようにしたい。 def data_generator(user, column, date_begin) records = user.diaries.group_by_week(week_start: :mon) { |n| n.diary_date } ## レコードが存在しない期間を指定すると, 存在していないキー指定するためnilが返る ## nilの場合にエラー, records[date_begin].map do |diary| diary.send(column) end end どのように実装するか? records[date_begin]がnilかどうか確かめ、nilの時は配列のnilの要素を7個作成して返す。 参考 nil? empty? blank? present? の使い分け def data_generator(user, column, date_begin) records = user.diaries.group_by_week(week_start: :mon) { |n| n.diary_date } if recordes[date_begin].present? records[date_begin].map do |diary| diary.send(column) end elsif records[date_begin].nil? 7.times.map { |n| nil } else raise "Error" end end 手動でテスト 今週(10/14-10/20)のレコードを削除し, 今週の体調グラフにアクセスし以下の項目を確認 エラーが発生しないか? グラフの縦軸の値が何も表示されていないか? テスト成功 実現したいこと(2) statistics/:column/from/:date_begin/to/:date_endでグラフ描画をする どのように実装するか? lib下のDateConstraintクラスでURIの/:date_begin, /:date_endを Date.valid_date?メソッドで検証する(year, month, dayでマッチデータオブジェクトを生成してメソッドに代入) コントローラでparams[:date_begin], params[:date_end]をインスタンス変数にセット コントローラでweekly, monthlyで場合分けしてReportクラスへ渡す PERIODSに該当する場合はリダイレクト? その他に実装したこと /statistics/:column/period/thisMonth(or prevMonth)でグラフ描画できるようにした。 プロを目指す人のためのRuby入門 例外処理について

Ruby
Rails

2019年10月14日(月)

4.0時間

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

アプリ制作 昨日のエラー 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クラスの主な処理 リクエストURIの:periodセグメントの文字列から始点, 終点の日付をセットする それらの日付とカラムから各日付のカラムの値を取り出す 前週、次週へのURI文字列を生成する 同期間の別カラムへのURI文字列を生成する 参考にしたもの SimpleCalenderというgemのコードをGithubで観察した。 「Reportクラスを継承して、Weekly, Monthlyでクラスを継承する」というアイデアはこのgemからトレースしてみた。 このGemはRailsの深いところのメソッドをたくさん使っていて、理解できないところは多かった。 コードを観察したことで、Railsの仕組みを理解したい!みたいなモチベーションが生まれた。

Ruby
Rails

2019年10月11日(金)

4.5時間

体調グラフ機能, 期間とカラムの遷移に必要な機能を再度洗い出し、実現方法を検討する。

route.rb でConstraint::PeriodConstraintを使って, /statistics/activity/period/thisWeekの"thisWeek"の部分をこちらが指定した単語のみになるよう制限を加えている。しかしno route matchedエラーが出てしまい、うまく作動していない。原因がわからない。

アプリ制作 体調グラフ機能で週間のグラフ描画は実装することができた。しかし、週・月単位の期間の遷移と異なるカラムの遷移を実装できていない。 コントローラとHelperのみにそれらの機能を実装すると、肥大化してしまう。 そこで、Reportクラスをlib配下に作成して、必要な機能をすべてそこに実装することに決めた。 必要な機能の洗い出し 体調グラフ機能の洗い出し 期間の指定 リンクから期間を指定する thisWeek, thisMonth, prevWeek, prevMonth 表示している期間の前後の期間へのリンクを生成する thisWeekなら、前後1週間へのリンク 期間をSep 15-22のような形で表示 カラムの指定 グラフは1カラムのみ描画する 表示しているカラム以外の2カラムへの同期間のリンクを生成する 期間の指定 リンクから期間を指定する routing /statistics/:column/period/:period コントローラ StrongParameterの実行 params のセット params[:column]がない場合は@column = :activity, あれば @columnに代入 params[:period]がない場合は@period = thisWeek, あれば@periodにセット params[:period]を解析してReport.new lib Reportクラス Report::WeeklyReportクラス attribute column date_begin date_end initialize column: paramsをそのまま date_begin: params[:period]を整形してセット date_end: date_begin.end_of_week publicメソッド date_range: labelを生成 url_for_next_period date_begin + 1.week.beginning_of_week date_end, date_beginのendofweek column, date_begin, date_endを合わせてurl文字列を返す url_for_previous_period 上と一緒 Report::MonthlyReport クラス View わからないこと 表示する期間がweeklyからmonthlyかで生成するReportクラスを分けたい。 ルーティングのcustome constraintで条件分岐をしてアクションを分ける アクションは1つにして、そのアクションの中でprams[:period]を解析して条件分岐

Ruby
Rails

2019年10月10日(木)

3.0時間

custom constraintsをlib直下のモジュールに定義する

groupdate gemのメソッドが有効にならずエラーが出てしまう。
MySQLのTimezoneの設定に関する記事を読み込み、エラーを解決した。

アプリ制作 実現したいこと 体調グラフ機能で、クエリパラメータを使用せずにURI・コントローラを設計する。 取り組んだこと TogglのDashboardのURIを観察してまとめる。 ルートは当日の週に設定 当日の週or当月は /period/thisWeek(or Month) 当日の前週or前月は/period/prevWeek(or Month) それ以外の期間は/from/yyyy-mm-dd/to/yyyy-mm-dd URIの設計を再度行う。 /statistics => statistics#report /statistics/:column/period/week or month => statistics#select_period /statistics/:column/from/yyyy-mm-dd/to/yyyy-mm-dd => select#select_date groupdate gemの導入 理由 週や月を前後するロジックをいちいち書いているとコントローラが肥大化するため Time zone support must be installedとあったので、下記コマンドを実行 mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql 以下の記事に従ってMysqlのdefault timezoneをAsia/Tokyoに変更 Set MySQL Timezone MacのローカルのMySQLのタイムゾーンをAWSのRDSのMySQLの設定と合わせる groupdate gem のメソッドがrails consoleで使用可能になった。 groupdateをrails consoleで動かしてみる #=> key: 週の初めの日(Dateオブジェクト) #=> value: その週のレコードの配列 group = diaries.group_by_week(series: true) { |n| n.diary_date } # 7月1週目の週のactivityカラムの集計をする date = Date.parse('2019-06-30', '%Y-%m-%d') group[date].map do |diary| diary.activity end #[-2, -1, 1, 0, -2, -2] ## コードめちゃ短くて済む!! custom constraints の設定 URIのセグメントをバリデーションする処理をコントローラに記述していたが、コントローラが肥大化してしまう。routeのconstraintでそれを代わりに行うことで、コントローラを軽くする・ # config/routes.rb Rails.application.routes.draw do get 'statistics/:column/period/:week_or_month', to: 'statistics#select_period', constraints: Constraint::SelectPeriodConstraint.new get 'statistics/:column/from/:date_begin/to/:date_end', to: 'statistics#select_date', constraints: Constraint::SelectDateConstraint.new end # app/lib/constraint/select_date_constraint.rb module Constraint class SelectDateConstraint def matches?(request) date_regex = /\d{4}\-\d{1,2}\-\d{1,2}/ date_regex.match(request.query_parameters['date_begin']) && date_regex.match(request.query_parameters['date_end']) end end end # app/lib/constraint/select_period_constraint.rb module Constraint class SelectPeriodConstraint PERIODS = ['thisWeek', 'thisMonth', 'prevWeek', 'prevMonth'] def matches?(request) PERIODS.include?(request.query_parameters['week_or_month']) end end end 分からないこと コントローラのbefore_actionで複数のメソッドを実行したい。1つのメソッドは引数を取る。 下のようなことがしたい。これができるのかは分からない。Procとかまだやってない... class StatisticsController < ApplicationController before_action do require_user_logged_in, set_current_user, set_params(statistics_params) end # 省略 end StatisticsControllerでReportを生成する処理をどうやって簡素に書くか? 期間を表す単語(thisWeek, prevMonth等)で期間をしていする方法、date_beginとdate_endを直接指定する2つのやり方がある。 groupdate gem を使ってどう書けば良いか? 重複の処理を書かないようにする。 プロを目指す人のためのRuby入門 第9章 例外処理を理解する

Ruby
Rails

2019年10月08日(火)

7.0時間

StatisticsControllerの一部の処理をサービスクラスに移行する

アプリ制作 週間・月間のグラフ描画機能 クエリパラメータで、column, date_begin, date_end, periodを指定して、それを元にグラフを描画できるようになった。 date_beginまたはdate_endとperiodを受け取って、ex_beginまたはnext_endを返すメソッドをstatistic_controller.rb のprivateに定義した。 グラフ描画のためのデータ(@report)を生成するためのサービスクラスを定義する StatisticControllerが肥大化して分かりにくいため。 サービスクラスはapp/lib配下に置く必要がある。 Solutions to Potential Upgrade Problems in Rails 5 autoloadや eagerloadが何かわからない。調べる必要がある。 app/lib/report/generate_report.rbの作成 Rails: Loading custom class from lib folder in controller Building a chart with Chart.js and Ruby on Rails @reportを作成する処理をサービスクラスに分けたので、以前よりかは読みやすくなったと思われる。ただ、我流でやってしまったので、もっとうまいやり方がありそう。 結果 #app/controllers/statistics_controller.rb class StatisticsController < ApplicationController before_action :require_user_logged_in, :set_current_user def report set_params(statistics_params) @chart = Report::GenerateReport.new(current_user, @column, @period, @date_begin, @date_end).call @ex_begin = to_ex_or_next_period(@date_begin, @period) @next_end = to_ex_or_next_period(@date_end,@period) end private def set_params(params) @column = params[:column].nil? ? :activity : params[:column].to_sym @period = params[:period].nil? ? :weeks : params[:period].to_sym @date_begin = params[:date_begin].nil? ? Date.today.begininng_of_week : parse_date(params[:date_begin]) @date_end = params[:date_end].nil? ? Date.today.end_of_week : parse_date(params[:date_end]) end def statistics_params params.permit(:column, :date_begin, :date_end, :period).to_h end def to_ex_or_next_period(date, period) case period when :months if date == date.beginning_of_month date.prev_month.beginning_of_month else date == date.end_of_month date.next_month.end_of_month end when :weeks if date.cwday == 1 date.ago(7.days) else date.cwday == 7 date.since(7.days) end else raise "pass valid argument" end end end #app/lib/report/generate_report.rb module Report class GenerateReport def initialize(user, column, period, date_begin, date_end) @user = user @column = column @period = period @date_begin = date_begin @date_end = date_end end def call chart_data(@user, @column, @date_begin, @date_end, @period) end private def chart_data(user, column, date_begin, date_end, period) x_axis_data = (date_begin..date_end).to_a y_axis_data = data_generator(user, x_axis_data, column) chart_data = { labels: x_axis_data, datasets: y_axis_data} end def data_generator(user, x_axis_data, column) x_axis_data.map do |date| user.diaries.where(diary_date: date).pluck(column)[0] end end end end

Ruby
Rails

2019年10月04日(金)

6.2時間

前後の期間のリンクを生成するコードを短く書く

次月(10月1日ー10月31日)へのリンクをクリックすると、クエリパラメータの`date_end`が2019-10-30となってしまい、`raise "pass valid argument"`が発動してしまう。 週の終わりまたは月の終わりを返さないといけないが、`.advance(months: 1)`ではそれができない。 periodが`:weeks`, `:months`で...

アプリ制作 実現したいこと 体調グラフ機能  StatisticsControllerに:date_beginまたは:date_end,:period`を受け取り、始まりからperiodを引いた期間又は終わりからperiodを足した期間で情報を取得して、どちらかを返り値で返すメソッドを作る。 考えたこと 例えば、9月1日ー9月30日のグラフを描画する。そこから前月(8月1日ー8月31日)次月(10月1日ー10月31日)に飛びたい。 #前月の始まり, 終わり ex_begin ex_end # 表示している月の始まり, 終わり date_begin date_end #次月の始まり, 終わり next_begin next_end 表示する期間が週/月で2パターンある。それぞれ条件分岐をすると長くなってしまうので、 date_beginまたは date_endのどちらかと periodを受け取り、ex_beginまたはnext_endを返すメソッドをコントローラに用意したい。 #app/controllers/statistics_controller.rb class StatisticsController < ApplicationController #省略 def report # クエリパラメータを@reportにセット(Structを使用) @report.date_begin = #Dateオブジェクト 2019-9-1 @report.date_end = #Dateオブジェクト 2019-9-30 @report.period = :months # 省略 @ex_begin = to_ex_or_next_period(@report.date_begin, @report.period) @next_end = to_ex_or_next_period(@report.date_end, @report.period) end private # date_beginまたはdate_endを受け取ってex_beginまたはnext_endを返す def to_ex_or_next_period(date, period) if (date.cwday == 7) || (date == date.beginning_of_month ) date.advance(period => -1) elsif (date.cwday == 1) || (date == date.end_of_month ) date.advance(period => 1) #ここがエラーの原因 else raise "pass valid argument" end end end <!-- app/views/statistics/report.html.erb --> <%= link_to "前月", statistics_path(column: @report.column, date_begin: @ex_begin, date_end: @report.date_begin - 1, period: @report.period) %> <p><%= @report.date_begin %>~<%= @report.date_end %></p> <%= link_to "次月", statistics_path(column: @report.column, date_begin: @report.date_end + 1, date_end: @next_end, period: @report.period) %> エラーと課題 次月(10月1日ー10月31日)へのリンクをクリックすると、クエリパラメータのdate_endが2019-10-30(月末は31日)となってしまい、raise "pass valid argument"が発動してしまう。 週の終わりまたは月の終わりを返さないといけないが、date.advance(months: 1)ではそれができない。 periodが:weeks, :monthsで条件分岐するとコード長くなってしまう。 プロを目指す人のためのRuby入門 include, exclude SingletonMethod DackTyping 静的型付け言語とRuby(動的型付け言語)の違い

Ruby
Rails

2019年10月02日(水)

5.0時間

前後の期間へのリンクを生成するメソッドのリファクタリング

前の期間のbegin, endと次の期間のbegin, endをそれぞれ計算して渡すコードが長くなってしまう
前の期間のbeginと次の期間のendだけメソッドを定義するだけで足りる?と考えた。明日、メンターに質問

アプリ制作 実現したいこと privateメソッドとして、:date_beginまたは :date_end, :periodを受け取り、始まりからperiodを引いた期間又は終わりからperiodoを足した期間で情報を取得して、どちらかを返り値で返すメソッドの定義 課題 前の期間のbegin, endと次の期間のbegin, endをそれぞれ計算して渡すのが面倒. 前の期間のbeginと次の期間のendだけメソッドを定義する. def next_period_end(date_end , period) date_end.advance(period => -1) end def previous_period_begin(date_begin, period) date_begin.advance(period => 1) end クエリ形式: ?column={column}&date_begin={date}&period=(weeks|months)&date_end={date} プロを目指す人のためのRuby入門 7.9.2 クラス変数 7.9.3 グローバル変数と組み込み変数 7.10.1 エイリアスメソッドの定義 7.10.2 メソッドの削除 7.10.3 ネストしたクラスの定義 7.10.4 演算子の挙動を独自に再定義する 7.10.5 等値を判断するメソッドや演算子を理解する 7.10.6 オープンクラスとモンキーパッチ

Ruby

2019年10月01日(火)

4.0時間

前後の期間へのリンク生成 - 体調グラフ機能

クエリパラメータをperiod=monthと指定してGETしても、@report.period = :weekになる。
pry.bindingで変数の中身を追っていくと、Strongparameterのperiodカラムがpermitされておらず、nilが返り, @report.periodがデフォルトの:weekになっていた。

アプリ制作 実現したいこと 体調グラフ機能 クエリパラメータでカラム・期間を指定してグラフを描画する 異なるカラム・前後の期間へのリンクを生成する。 課題 以下の2つのメソッドを定義する必要があると考えた。 reportインスタンスのdate_begin, date_end, periodを受け取って、前後の期間へのクエリパラメータを返すメソッド date_begin, date_end, colmunを受け取って同時期の別カラムへのクエリパラメータを返すメソッド ここまで考えたところで、メンターに質問して、並行して自分で進める。 実装 前後の期間へのリンク生成 URIでperiod=monthと指定しても、@report.period = :weekになる periodとdate_begin, date_endの差を検証していない=> 後に回そう StrongParameterでperiodパラメータがpermitされていなかった。 以下のように実装し、一応動いた。 # app/helpers/statistics_helper.rb def previous_period_generator(report) date_begin_and_end = [] if report.period == :month date_begin = report.date_begin << 1 date_end = report.date_end << 1 elsif report.period == :week date_begin = report.date_begin - 1.week date_end = report.date_end - 1.week else date_begin = report.date_begin - 1.week date_end = report.date_end - 1.week end date_begin_and_end << date_begin date_begin_and_end << date_end date_begin_and_end end def next_period_generator(report) date_begin_and_end = [] if report.period == :month date_begin = report.date_begin << -1 date_end = report.date_end << -1 elsif report.period == :week date_begin = report.date_begin + 1.week date_end = report.date_end + 1.week else date_begin = report.date_begin + 1.week date_end = report.date_end + 1.week end date_begin_and_end << date_begin date_begin_and_end << date_end date_begin_and_end end # app/views/statistics/report.html.erb <h3><%= @report.column %></h3> <% before = previous_period_generator(@report) %> <%= link_to "前", statistics_path(column: @report.column, date_begin: before[0], date_end: before[1]) %> <p><%= @report.date_begin %>~<%= @report.date_end %></p> <% after = next_period_generator(@report) %> <%= link_to "次", statistics_path(column: @report.column, date_begin: after[0], date_end: after[1]) %> プロを目指す人のためのRuby入門 7.7.3 復習, 7.7.7復習, bashスクリプト記述 7.8 定数 7.9 さまざまな変数 7.9.1 クラスインスタンス変数 bashの設定 チェリー本の学習記録として写経したコードと主な実行結果をファイルに残している。 実行結果をターミナルからコピペする手間が無駄なので、以下の設定をした。 samle.rbに実行結果をコメントアウトした状態で出力するスクリプトファイルを作成 上記スクリプトファイルを実行するコマンドのエイリアスを設定 思ったこと エラーもファイルに出力できるようにしたい テストをかけるようにならないと、動作が正確か自信が持てない。手動のチェックが面倒

Ruby

2019年09月30日(月)

5.8時間

150件中の 101-125件 を表示