学習履歴一覧

150件中の 76-100件 を表示

(Chart.js)チャートUIの改善

Statistics#indexのviewを改善する。 labelから西暦を削除する。Viewに渡されたchartlabelを整形する。 const labels = chartlabel; console.log(labels); //["2020-01-20", "2020-01-21", "2020-01-22", "2020-01-23", "2020-01-24", "2020-01-25", "2020-01-26"] var result = labels.map(function( value) { return value.substr(5); }); console.log(result); //["01-20", "01-21", "01-22", "01-23", "01-24", "01-25", "01-26"] 西暦は削除されたが、月が一桁の際に先頭に0が付いてしまい、見にくい。条件分岐で先頭が0の場合は0を削除したい。 ここまで考えたところで、Reportモデル生成時にラベルを整形した方が、DRYになると気づいた。 そこで、Reportを生成するサービスクラス内のchart_dataメソッドを書き換えた。 #app/lib/generate_report/report.rb def chart_data(user, date_begin, date_range) # labels = date_begin..date_end).to_a labels = date_range.map { |date| date.strftime("%-m月%-d日") } y_axis_data = data_generator(user, date_begin) chart_data = { labels: labels, datasets: y_axis_data } end <参考> Building a chart with Chart.js and Ruby on Rails 【JavaScript入門】配列処理をするmap()の使い方とMapオブジェクトの解説! 【Ruby入門】strftimeで日付・時刻を書式指定して文字列に変換する 画面幅が狭くなるごとにグラフの高さが縮んでしまう。 Chart.jsのオプションで高さを動的に設定できるようにしたい。 いままではViewファイルのJavascriptでオプションを設定していた。 サービスクラスのReportクラスから設定できる様に書き換える。 # app/lib/generate_report/report.rb module GenerateReport class Report #省略 def chart_options options = { responsive: true, scales: { yAxes: [{ ticks: { max: 2, min: -2, stepSize: 1.0 } }] } } end #省略 end 基本情報1時間

Ruby
JavaScript
Rails
基本情報技術者

2020年01月21日(火)

2.7時間

Uncaught TypeError: $(...).datepickerと表示される不具合などを修正する

修正点1 #application.html.erb <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> <script src="https://kit.fontawesome.com/65c7366224.js" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> </head> <body> #省略 #最下段 <script type="text/javascript"> $(document).ready(function () { $('.datepicker').datepicker({ dateFormat: "yy-mm-dd" }); $('.overlay').on('click', function () { // hide sidebar $('#sidebar').removeClass('active'); // hide Overlay $('.overlay').removeClass('active'); }); $('#sidebarCollapse').on('click', function () { // open sidebar $('#sidebar').addClass('active'); // fade in the Overlay $('.overlay').addClass('active'); }); }); </script> </body> このように記述した際にブラウザでエラーが発生する。 Uncaught TypeError: $(...).datepicker is not a function at HTMLDocument.<anonymous> (dashboard:365) at e (jquery-3.4.1.slim.min.js:2) at t (jquery-3.4.1.slim.min.js:2) 原因の仮説 datepickerはjQuery-UIの機能の一つである。jQuery-UIがloadされていないのではないか? 対処 Googleの Hosted LibrariesからjQuery-UIのスニペットをコピーし、application.html.erbのheadタグ最下段にペーストする。 結果 datepickerが使用可能になった。 考えたこと CDNの仕組みとは? 修正点2 diaries#newの投稿日フォームに当日の日付をデフォルトで表示する。 (日付選択の手間を省くことができる。) 対処 以下の様に記述した。 $('.datepicker').datepicker({ dateFormat: "yy-mm-dd", defaultDate: new Date() }).datepicker("setDate", new Date()); 結果 フォームに日付が自動で出力される様になった。 修正点3 Dashboards#indexで、投稿カードのコンディション部分の表示が崩れる。 divとulタグにスタイルを当てていたが、うまくいっていない。 対処 tableを導入した。table要素にはmarginを設定できず、paddingを設定することでレイアウトを微調整した。 # layouts/_diaries.html.erb <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <th>疲労</th> <td> <ul class="list-group list-group-horizontal"> <% conditions = condition_generator(diary.activity) %> <% conditions.each do |key, value| %> <%= content_tag(:li, key, class: "#{class_generator(value)}") %> <% end %> </ul> </td> </tr> # 以下省略 /* style.css */ /* conditions */ .conditions > table > tbody > tr > th { padding-right: 10px; } .conditions > table > tbody > tr > th, td { padding-bottom: 10px; } 結果 いままで表示が崩れていたiphone6/7/8でも表示が崩れない様になった。

Ruby
Rails
jQuery

2020年01月16日(木)

2.0時間

createアクションでフォームから間違った値をPOSTした際にエラーのフラッシュメッセージが表示されない(2)

実現したいこと Diary#newのviewページで, 投稿に失敗した際にエラーのフラッシュメッセージを表示させたい。 Diaryモデルでは投稿の日付(:diary_date)が重複しないようにvalidationを設定している。 すでに投稿済みの日付(2020-01-13)で再度投稿した際に、フラッシュメッセージでエラー表示を行いたいです。 メンターの指摘 flashオブジェクト にはmessage, message_type共に格納されている。 つまり、controler−>viewまでのデータフローは正しく行われている。 ボトルネックとなっていると考えられる部分はview以降の処理になると推測できる。 確認すべき点 Class alert alert-〇〇は正しくCSSが適用されているか 基本的に、alertに反応してフラッシュメッセージを発火するのはBootStrapによって定義されているため 考えたこと1 そもそもflashオブジェクトとは何か? flashはアクション間で一時的なプリミティブ型(String, Hash, Array)を渡す機能を提供する。flashに渡された値は次のアクションに渡され、flashは初期化される。flashは通知やアラート機能を実装する際に大きな力を発揮する。... 対処 _flash_messages.html.erbのクラス名が正しいかを確認する。 alert-danger は正しい。 Bootstrapが正しく読み込まれているか? _flash_message.html.erbにclass名がalert alert-dangerのdivを書いて、正しく表示されるたか試してみる。結果、正しく表示された。 新しい仮説 Trouble getting flash notice to display in page viewに以下の記述があった。 your layout will not update because Turbolinks is preventing it from doing so. As unlikely as this is, you may wish to test disabling turbolinks for the link you're loading. Turbolinksがレイアウトの更新を妨害しているとの指摘。このTurbolinksの無効化を試すと良いらしい。 Handling form errors with Rails automatically? #85 に以下の記述があった。 Rails 5 introduced form_with which by default treats all forms as AJAX unless you pass the :local option. The solution for Turbolinks should probably be applied to Rails to work with form_with also. See https://github.com/rails/rails/blob/master/guides/source/working_with_javascript_in_rails.md Rails5のform_withヘルパーには:localオプションを渡さない限りデフォルトでAJAXが有効になっている。 対処2 form_withヘルパーにlocal: trueを渡す 結果 エラーのフラッシュメッセージが表示される様になった。 考えたこと2 Turbolinksとは何か? AJAXがなぜflashメッセージの表示を妨害しているのか?

Ruby
Rails

2020年01月15日(水)

2.1時間

createアクションでフォームから間違った値をPOSTした際にエラーのフラッシュメッセージが表示されない

アプリ制作 修正点1 960px以下で/loginのページにログイン後に表示すべきサイドバーが表示されている。 原因 ヘッダー要素をログイン前後関係なく表示するようにコーディングしてしまっている。 対処 logged_inメソッドを使って条件分岐をする。 結果 ログイン前にサイドバーが表示されなくなった。 修正点2 User#newの表示が崩れている。 原因 yieldでリクエストされたテンプレートを表示する際、 new.html.erbが埋め込まれる親要素がflex directionがrow-reverseになっているため。 対処 session#newでは表示が崩れていないので、 Session#newと同じHTMLを記述する。 結果 User#newで表示が崩れなくなった。 修正点3 Diary#newのページでエラーのが表示されない。 実現したいこと Diary#newのviewページで, 投稿に失敗した際にエラーのフラッシュメッセージを表示させたい。 Diaryモデルでは投稿の日付(:diary_date)が重複しないようにvalidationを設定しています。 すでに投稿済みの日付(2020-01-13)で再度投稿した際に、フラッシュメッセージでエラー表示を行いたいです。 状況 投稿済みの日付をフォームに入力し、POSTしました。すると以下のエラーが発生し、投稿画面には入力した値がフォーム上にそのまま表示され、フラッシュメッセージは表示されません。 app/controllers/diaries_controller.rb:11:in `create' Started POST "/diaries" for ::1 at 2020-01-14 14:27:03 +0900 Processing by DiariesController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"hELYtfdo11Si85PhI5MT1VPju020UUYM2ua5IyhfADjW3+EJldcXbwbLdggouVT0Cj2CM739EW+vcyH1pDQ/bA==", "diary"=>{"diary_date"=>"2020-01-13", "activity"=>"-2", "mood"=>"-1", "appetite"=>"0", "content"=>"adas"}, "commit"=>"日記を投稿"} User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 ↳ app/helpers/sessions_helper.rb:3 (0.2ms) BEGIN ↳ app/controllers/diaries_controller.rb:11 Diary Create (1.2ms) INSERT INTO `diaries` (`content`, `activity`, `mood`, `appetite`, `user_id`, `created_at`, `updated_at`, `diary_date`) VALUES ('adas', -2, -1, 0, 1, '2020-01-14 05:27:03', '2020-01-14 05:27:03', '2020-01-13') ↳ app/controllers/diaries_controller.rb:11 (0.4ms) ROLLBACK ↳ app/controllers/diaries_controller.rb:11 Completed 500 Internal Server Error in 54ms (ActiveRecord: 17.6ms) ActiveRecord::RecordNotUnique (Mysql2::Error: Duplicate entry '2020-01-13-1' for key 'unique_diary_per_date': INSERT INTO `diaries` (`content`, `activity`, `mood`, `appetite`, `user_id`, `created_at`, `updated_at`, `diary_date`) VALUES ('adas', -2, -1, 0, 1, '2020-01-14 05:27:03', '2020-01-14 05:27:03', '2020-01-13')): app/controllers/diaries_controller.rb:11:in `create' 試したこと Diariesコントローラのcreateメソッドを以下の様に変更した上で同じことを試しました。(ActiveRecord::RecordNotUniqueをトリガーとして、flashメッセージを表示させようとしました。) def create begin @diary = current_user.diaries.build(diary_params) if @diary.save flash[:success] = '日記が正常に投稿されました' redirect_to "/dashboard/#{@diary.diary_date.strftime("%Y-%m")}" end rescue ActiveRecord::RecordNotUnique flash[:danger] = 'メッセージの投稿に失敗しました。' render 'new' end end 結果 flashメッセージは依然として表示されませんでした。Chromeのデベロッパーツールでflashメッセージの部分のHTMLが表示されていません。ただ、HTTPステータスは500から200に変化しました。 Started POST "/diaries" for ::1 at 2020-01-14 15:49:07 +0900 Processing by DiariesController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"6vPi65Np1MxzX5Y/jvIHpnoededwTCbWaH2wB2Zfye+4bttX8dYU99dnc9aF2ECHI8BMmXngcbUd6CjR6jT2uw==", "diary"=>{"diary_date"=>"2020-01-13", "activity"=>"-2", "mood"=>"-1", "appetite"=>"-1", "content"=>"asdas"}, "commit"=>"日記を投稿"} User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 ↳ app/helpers/sessions_helper.rb:3 (0.2ms) BEGIN ↳ app/controllers/diaries_controller.rb:12 Diary Create (0.8ms) INSERT INTO `diaries` (`content`, `activity`, `mood`, `appetite`, `user_id`, `created_at`, `updated_at`, `diary_date`) VALUES ('asdas', -2, -1, -1, 1, '2020-01-14 06:49:07', '2020-01-14 06:49:07', '2020-01-13') ↳ app/controllers/diaries_controller.rb:12 (0.7ms) ROLLBACK ↳ app/controllers/diaries_controller.rb:12 Rendering diaries/new.html.erb within layouts/application Rendered layouts/_form.html.erb (2.6ms) Rendered diaries/new.html.erb within layouts/application (6.1ms) Rendered layouts/_header.html.erb (0.5ms) Rendered layouts/_flash_messages.html.erb (0.3ms) Rendered layouts/_content_nav.html.erb (0.5ms) Completed 200 OK in 161ms (Views: 154.5ms | ActiveRecord: 2.0ms) 調べたこと flash変数にエラーメッセージが格納されているかをデバッガで確認しました。 コントローラで指定したメッセージは格納されていました。 From: /Users/bupolang/projects/cocologue/app/views/layouts/_flash_messages.html.erb @ line 3 ActionView::CompiledTemplates#_app_views_layouts__flash_messages_html_erb___4002453590638780199_70244160115980: 1: <% flash.each do |message_type, message| %> 2: <% binding.pry %> => 3: <div class="alert alert-<%= message_type %>"><%= message %></div> 4: <% end %> [1] pry(#<#<Class:0x00007fc6192fa350>>)> message => "メッセージの投稿に失敗しました。" [2] pry(#<#<Class:0x00007fc6192fa350>>)> message_type => "danger" [3] pry(#<#<Class:0x00007fc6192fa350>>)> exit Rendered layouts/_flash_messages.html.erb (19625.1ms) Rendered layouts/_content_nav.html.erb (0.5ms) Completed 200 OK in 19844ms (Views: 19836.9ms | ActiveRecord: 2.1ms) 原因(仮説) データベースでrollbackが起こってしまっているから? バリデーションができていない。

Ruby
Rails

2020年01月14日(火)

2.0時間

Dashboards#indexで前月のリンクをクリックすると当月の一覧にリダイレクトされる不具合を修正した。

原因の仮説が間違ってしまうこと。手を動かす前に事実を言葉にして原因をブレストした。

アプリ制作 不具合 Dashboards#index 前月へのリンクをクリックすると、/dashboardへリダイレクトされる。 原因 Started GET "/dashboard/2019-12" vendor/bundle/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Processing by DashboardsController#index as HTML Parameters: {"year_month"=>"2019-12"} Redirected to http://localhost:3000/dashboard Completed 302 Found in 29499ms (ActiveRecord: 0.4ms) GET /dashboard/2019-12した後に、/dashboardにリダイレクトされている。 Dashboardコントローラを確認する。 # Dashboard#index def index @diary = current_user.diaries.build if params[:year_month].nil? .... elsif Date.strptime(params[:year_month], '%Y-%m').month < Date.today.month .... else redirect_to '/dashboard' end end # リクエストのパラメータに:year_monthが含まれる場合に、リクエストに含まれる:year_monthパラメータの月にあたる数値と現在の月の数値を比べ、リクエストした年月の数値の方が小さかった場合に、前月のレコードを検索して返す処理を記述していた。 年が変わって、12月のレコードが 12 < 1 でfalseとなってしまい、else節が実行されてしまうようになっていた。(なんでこんなこと書いたのか覚えてない…) 対処 # Dashboards#index ... elsif params[:year_month] .... とした。 結果 月ごとのレコードが表示される様になった。 不具合(2) ログアウトした後にログイン中のナビバーが表示される。

Rails
Ruby

2020年01月09日(木)

0.8時間

アプリの修正点の洗い出し

アプリのヒアリング 就労移行支援のスタッフにアプリを使ってもらい、アドバイスを頂いた。 体調のスコアリングはアイコンや顔にするとよい 数値だと真ん中を選びやすい UI/UXについて 見たときに言葉の説明なく、直感的に操作の仕方がわかると良い 日記を書くことでどんどんレベルアップしていくようなフィードバックがあると良い(即時性) 例:キャンディークラッシュ 実装までできなくてもワイヤーフレームでこの先のビジョンとして示すでも可 今後このアプリをどうしていきたいか? 実装で難しかったこと、学んだこと、今後失敗をどう生かすか? 想定ユーザは誰か? アプリ修正点洗い出し User#new - ページの表示が崩れている Session#new - エラーが表示されない Dashboard#index - メッセージ表示がない - 日記カードの月の部分が1文字削れている - 削除ボタンをドロップダウンメニューにする Diary#new - エラー表示欄がない - フォームが本文を書く部分だと分からない、 ’本文’と表示する - フォームに何を書くか説明する文言を入れる - 投稿日を自動表示する - 投稿日のカレンダーが表示されない - 投稿成功後のメッセージが表示されていない Statistics#index - グラフのサイズがなんども変わる - 初回アクセス時にグラフが表示されない - 期間選択ボタンのUI 月間・週間ボタンを含め - カラム選択ボタンのUI

Bootstrap
HTML / CSS

2019年12月18日(水)

1.0時間

150件中の 76-100件 を表示