学習履歴一覧

150件中の 126-150件 を表示

クエリパラメータをコントローラで取得する

コントローラでbinding.pryを起動してpramasにアクセスしようとしたが、NameError: undefined local variable or method `params'と出てしまう。
クエリパラメータの書き方におかしいところがないか、クエリパラメータへのアクセスの仕方を英語で検索し、記事を4つほど読み込んだ。
ふとbinding.pryの位置がおかしいのかもと頭に...

アプリ制作 実現したいこと コントローラでクエリパラメータを取得したい # リクエスト /statistics?column=activity&date_begin=2019-09-12&date_end=2019-09-21 # routing get 'statistics' to: 'statistics#report' # app/controllers/statistics_controller class StatisticsController < ApplicationController #省略 binding.pry #省略 def report #省略 end end # paramsを参照できない [1] pry(StatisticsController)> params NameError: undefined local variable or method `params' for StatisticsController:Classfrom (pry):1:in `<class:StatisticsController>' request.query_parametersでは取得できない Rails 5: unable to retrieve hash values from parameter URIでのクエリパラメータの書き方合っているか? よくよく見るとデバッガの位置を間違えていた。 ルーティングで`statistics => statistics#reportなので、reportメソッドの名前空間からでないとparamsにアクセスできない? ここらへんの仕組みが理解できていない。 # app/controllers/statistics_controller ; (省略) def report binding.pry #省略 end # paramsを取得できた [1] pry(#<StatisticsController>)> params => <ActionController::Parameters {"column"=>"activity", "date_begin"=>"2019-09-12", "date_end"=>"2019-09-21", "controller"=>"statistics", "action"=>"report"} permitted: false> 次は、取得したparamsをStrongParameterに通す

Linux
Ruby

2019年09月25日(水)

5.5時間

体調グラフを描画するためのデータ生成

statistic_controllerの実装の仕方がわからない。

実現したいこと 体調グラフをDiaryモデルの各カラムについて、週ごと、月ごとに描画したい。 ルーティング カラムの選択、週/月の選択はquery parameterを使う クエリパラメータの形式 ?column={column}&date_begin={date}&period=months&date_end={date} ruby # config/routes.rb get 'statistic' to: statistics#index Statistic_controller.rb class StatisticsController < ApplicationController before_action :require_user_logged_in, :set_current_user Report = Struct.new ( :column, :date_begin, :date_end, :x_axis, :y_axis ) def index @report = Report.new.tap do |r| r.column = params["column"].nil? ? :activity : params["column"] r.date_begin = params["date_begin"].nil? ? Date.today.beginning_of_week : params["date_begin"] r.date_end = params["date_end"].nil? ? Date.today.end_of_week : params["date_end"] r.x_axis = (r.date_begin..r.date_end).to_a r.y_axis = date_generator(r.x_axis, r.column) end end private def data_generator(x_axis, column) x_axis.map do |date| current_user.diaries.where(diary_date: date).pluck(colmun)[0] end end end 考えたこと chart.jsでグラフを描画するために必要なデータは以下の3つ Diaryモデルのカラム (activity, mood, appetiteのいずれか) 期間の起点(date_begin) 期間の終点(date_end) date_beginからdate_end までのそれぞれの日がグラフの横軸(x_axis) グラフの横軸のそれぞれの日におけるDiaryモデルのカラムの値が縦軸(y_axis) Chart.jsには横軸・縦軸それぞれの値の配列を渡す。 そのために、以下の処理が必要。 date_beginと date_endから横軸の配列を作成する。 private以下に、横軸の配列・Diaryモデルのカラムを引数にとって、縦軸の値の配列を返すメソッドを定義する。 発生したエラー わからないこと 以下のように r. date_begin = ....と定義した後に下の行で r.date_beginを再度使うことはできるのか? def index #省略 @report = Report.new.tap do |r| # 省略 r.date_begin = ... r.x_axis = (r.date_begin..r.date_end).to_a r.y_axis = date_generator(r.x_axis, r.column) end end 最後にメンターに質問を送付して終わりました。 参考 Rails APIのURLにクエリパラメータを含める Rails | nested routes if nil Rails: How to get URL params without routing parameters (or vice versa)

Ruby

2019年09月23日(月)

7.0時間

Structを使って値の週間集計を行い、描画する

週間の各日付のDateオブジェクトと、集計したいカラムのシンボルを受け取って、値を探して返すメソッドの定義。
(例えば、7/2のactivityカラムを指定すると, -2が返る)
activerecordのselectメソッドではオブジェクトが返ってしまい値を返せなかった。調べる中でpluckメソッドが適当だと分かった。

アプリ制作 実現したいこと StatisticコントローラでDiaryの週間集計をする。 週間の各コンディションの値を下のようなテーブルにしたい。 そして配列にしてChart.jsに渡したい。 From: September 15 To: September 21 どうすればこのテーブルを作れるのか? Statistic Pathのリンクをクリック Date.todayから週の初めの日、週の終わりの日を算出する Range(週の初め..週の終わり).to_a でlabel(グラフの横軸)が出来上がる。 labelとカラムから各カラムの値の配列を返す 戻り値用の配列を初期化 labelの配列とカラムを引数にとる labelから日付を1つずつ取り出し、その日のDiaryレコードを検索 Diary.カラムで値を取り出して戻り値用の配列につっこむ labelと各カラムの配列を返す StatisticControllerの実装 class StatisticsController < ApplicationController before_action :require_user_logged_in, :set_current_user WeeklyReport = Struct.new( :date_from, :date_to, :labels, :activity_array, :mood_array, :appetite_array ) def index activity = 'activity' @weekly_report = WeeklyReport.new.tap do |r| r.date_from = Date.today.beginning_of_week r.date_to = Date.today.end_of_week r.labels = week_dates r.activity_array = array_generator(week_dates, :activity) r.mood_array = array_generator(week_dates, :mood) r.appetite_array = array_generator(week_dates, :appetite) end end private def week_dates today = Date.today (today.beginning_of_week..today.end_of_week).to_a end def array_generator(week_dates, colmun) week_dates.map do |date| current_user.diaries.where(diary_date: date).pluck(colmun)[0] end end end 週間集計のテーブルを描画できた。 次は、これをChart.jsに渡してグラフにする。 分からないところ tapメソッド # tapメソッドは、ブロック変数にレシーバ自身を代入してブロックを実行する。 # 戻り値はレシーバ自身 "hello".bytes.to_a.tap {|arr| p arr } # "hello".bytes.to_a # => [104, 101, 108, 108, 111] # このArrayがブロック引数(|arr|)に入る。  # そして p arr が実行される。 # 戻り値はレシーバ自身なので、Arrayが返る。 "hello".bytes.to_a.tap {|arr| p arr }.collect {|byte| byte.to_s(16) }.tap {|arr| p arr } # つまり... [104, 101, 108, 108, 111].collect {|byte| byte.to_s(16) }.tap {|arr| p arr } # mapのエイリアスなので、Arrayを一つずつブロック引数に入れて、ブロックを実行 [104, 101, 108, 108, 111].collect {|byte| byte.to_s(16) } # => ["68", "65", "6c", "6c", "6f"] # つまり... ["68", "65", "6c", "6c", "6f"].tap {|arr| p arr } # レシーバがブロック引数に代入され、ブロックが実行される p ["68", "65", "6c", "6c", "6f"] # 戻り値はレシーバ自身 => ["68", "65", "6c", "6c", "6f"] # 1行にできるのはわかったけど、逆に読みにくいのでは?笑 Rubyのレファレンスを読んで意味をつかんだ。 プロを目指す人のRuby入門 正規表現 初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」 初心者歓迎!手と目で覚える正規表現入門・その2「微妙な違いを許容しつつ置換しよう」 最後の方の解決策2まで

Ruby
Rails

2019年09月19日(木)

5.0時間

Statisticコントローラの実装(体調グラフ描画のためのデータ生成)

自分のやりたいことに近い記事のRubyの文法を理解すること。
わからないところはRubyの公式ドキュメントや「プロを目指す人のRuby入門」を読むことで少しずつ理解できた。

アプリ制作 体調グラフ機能 ~~Diaryのテストデータ生成~~ ~~直近3ヶ月分を毎日(グラフで可視化するため)~~ ~~rails consoleでテストコード実行~~ ~~Diaryモデルのインスタンスメソッド定義~~ ~~DiaryインスタンスのWeek numberを返す~~ Statisticコントローラの実装の下調べ Ruby Date.strftime('') # %w - Day of the week (Sunday is 0, 0..6) # %W - Week number of the year. The week starts with Monday. (00..53) # 生成したいグラフ 例) Week number: 37 15_Sun(0) 16_Mon(1) 17_Tue(2) 18_Wed(3) 19_Thu(4) 20_Fri(5) 21_Sat(6) activity 1 2 -1 -2 1 0 1 mood 1 2 -1 -2 1 0 1 appetite 1 2 -1 -2 1 0 1 必要なデータ Year: 何年の? Week number : 何番目の週? Intial day of the week: 何日から Last day of the week: 何日まで activity : その週の最初の日から終わりの日までのそれぞれの日におけるactivityの値の配列 mood: 上に同じ appetite: 上に同じ #Diary.weekで週番号を返すメソッドを定義済み user = User.last diaries = user.diaries diaries.group_by { |item| item.week } # => { "week_number" => [ diary1, diary2,,,,]} current_user.entries.group_by(&:week).each do |week, diaries| end # weekに週番号の文字列、diariesにその週のdiaryインスタンスの配列が入っている # diariesの配列を受け取って、activity, mood, appetiteの値を取り出すメソッドを定義しないといけない。 # メソッドのイメージ activity = [] mood = [] appetite = [] (週の最初の日..週の最後の日).each do |day| activity << diary.find(day).activity end 参考 https://stackoverflow.com/questions/4389395/how-do-i-get-a-date-from-a-week-number https://rubikitch.hatenadiary.org/entry/20080502/tap https://ref.xaio.jp/ruby/classes/enumerable/group_by https://www.toptal.com/ruby-on-rails/decoupling-rails-components プロを目指す人のRuby入門 ハッシュとシンボルの詳細 ||=や!!などのイディオムについて

Ruby
Rails

2019年09月18日(水)

5.2時間

POSTされた値によって動的にHTMLのクラス名を変更する(3)【一応動いた】

DiariesControllerで以下のようなハッシュを生成し、View側で取り出そうと考えていたが間違った考え方だった。なぜかPostしたparamsをそのままViewで使うみたいなことを考えていた。

ポートフォリオ制作 生成したいHTML(:activity => "0"のとき) <div class="condition-wrapper"> <div class="condition-title">活動量</div> <ul class="list-group list-group-horizontal"> <li class="list-group-item">-2</li> <li class="list-group-item">-1</li> <li class="list-group-item list-group-item-info">0</li> <li class="list-group-item">+1</li> <li class="list-group-item">+2</li> </ul> </div> 勘違い DiariesControllerで以下のようなハッシュを生成し、View側で取り出そうと考えていたが間違った考え方だった。なぜかPostしたparamsをそのままViewで使うみたいなことを考えていた。 @conditions = { :activity => { "-2" => false, "-1" => false, "0" => true, "+1" => false, "+2" => false },,,,,,} 実際はcreateアクションの後にredirectされるため、indexアクションの結果、Viewで表示される。 一応動くものはできた。 勘違いに気づいた後、DiaryのViewとHelperにメソッドを記述し、上記のHTMLを生成できました。 ただ、DRYではないし、もっと簡潔に書けそうだなーと思っています。 プロを目指す人のためのRuby入門 4.5.2 n以上m未満の判定 4.5.3 range object with case statement 4.5.5 loop with range object 4.5.4 create an array of consecutive values 4.6 RGB変換プログラムの作成

Ruby
HTML

2019年09月12日(木)

5.5時間

HTMLのclass名を動的に変更する(2)

コントローラでインスタンス変数にハッシュを代入してViewで展開するべきか、それともlocaleを使用してrenderすべきかが分からないこと。

アプリ制作 Viewで生成したいHTML(活動量が0のとき) 活動量が0のとき、0のliタグにのみclass名を追加する。 <div class="condition-wrapper"> <div class="condition-title">活動量</div> <ul class="list-group list-group-horizontal"> <li class="list-group-item">-2</li> <li class="list-group-item">-1</li> <li class="list-group-item list-group-item-info">0</li> <li class="list-group-item">+1</li> <li class="list-group-item">+2</li> </ul> </div> DiariesController実装 DiariesCopntrollerに@conditionsのようにインスタンス変数を作り、そこにconditionに関するhashを代入するべきか? locale を使用すべきか? @diariesからconditionの値にアクセスできるのでは? 明日、質問しようと思います。 # params => { "diary_date" => "2019-09-10", # "activity" => "0", # "mood" => "+1", # "appetite" => "0", # "content" => "テスト" } #app/controllers/diaries_controller.rb class DiariesController < ApplicationController def create @diary = current_user.diaries.build(diary_params) @conditions = {} if @diary.save flash[:success] = '日記が正常に投稿されました' columns.each do |column| @conditions[column] = condition_hash_generator(column) end redirect_to root_url end end private columns = [:activity, :mood, :appetite] def condition_hash_generator(column, params) hash = {} condition_hash = {} values = ["-2", "-1", "0", "+1", "+2"] values.each do |value| if value == params[column] hash[value] = true else hash[value] = false end end condition_hash[column] = hash condition_hash end

Ruby
HTML

2019年09月11日(水)

3.0時間

condition の値によってHTMLのクラスを動的に変更する機能

特になし

アプリ制作 RadioボタンにBootstrapを適用する 見た目より機能を優先するため諦める。 td > label に右マージンを設定 condition の値によってHTMLのクラスを動的に変更する機能 実現したいこと 活動量が0の時、日記のViewで−2、ー1、0、+1、+2の中で0にのみに色を付ける 生成したいHTML(活動量が0のとき) <div class="condition-wrapper"> <div class="condition-title">活動量</div> <ul class="list-group list-group-horizontal"> <li class="list-group-item">-2</li> <li class="list-group-item">-1</li> <li class="list-group-item list-group-item-info">0</li> <li class="list-group-item">+1</li> <li class="list-group-item">+2</li> </ul> </div> どう実現するか?(考えたのみ、次回検証) params ( "diary" => { "diary_date" => "2019-09-10", "activity" => "0", "mood" => "+1", "appetite" => "0", "content" => "テスト" } # 各カラムの各value("-2", "-1",,,,"+2")ごとにparamsの値と一致するかを評価し、ハッシュを作成する。 # Viewでliタグを生成する際に、真偽値によってクラス名を追加する/追加しないと条件分岐させるため。 columns = [:activity, :mood, :appetite] def conditon_hash_generator(column) hash = {} condition_hash = {} values = ["-2", "-1", "0", "+1", "+2"] values.each do |value| if value == params[:diary][column] hash[value] = true else hash[value] = false end condition_hash[column] = hash end columns.each do |column| # 怪しい # 生成したhashを一つずつ追加したい @conditions << condition_hash_generator(column) end # @conditions はこうなるはず.... # {:activity => {"-2"=>false, "-1"=>false, "0"=>true, "+1"=>false, "+2"=>false }, :mood => {......... }, :appetite => {.......}} 参考:https://stackoverflow.com/questions/2626936/whats-an-elegant-way-to-conditionally-add-a-class-to-an-html-element-in-a-view プロを目指す人のためのRuby入門 2.12.3 Expression, Statememt 2.12.5 Understanding reference concept 2.12.6 Built-in library,Standard Library 2.12.7 Require Rubyを実行しているディレクトリがパスの起点になる 2.12.10 puts, print, p 3章 テストの自動化 minitest

Ruby
HTML
CSS

2019年09月10日(火)

4.3時間

MySQLの再インストール

Mysqlが起動できない いつものようにMysqlを起動しようとしましたが、できません。 $ mysql.server start Starting MySQL .. ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXXXXXX.local.pid). $ mysql -u root -p Can't connect to local MySQL server through socket '/tmp/mysql.sock'(2) pidファイルの自作・chownでlocal以下のディレクトリの所有権を変更する、プロセスを終了させるなどを試したが、エラー内容が変わりませんでした。 最終的に、MySQLのデータを削除し、再インストールすることで解決しました。 # MySQLのデータファイルやログなどが格納されているディレクトリを削除する $ sudo rm -rf /usr/local/var/mysql # MySQLを再インストール $ brew uninstall mysql $ brew install mysql # MySQLを起動 $ mysql.server start Starting MySQL SUCCESS! 時間がかかりすぎた…笑 参考: https://reasonable-code.com/mysql-start-error/ https://qiita.com/_natsu_no_yuki_/items/ae4c94187093e4ab3cdc https://qiita.com/carotene4035/items/e00076fe3990b9178cc0 https://stackoverflow.com/questions/4963171/mysql-server-startup-error-the-server-quit-without-updating-pid-file https://stackoverflow.com/questions/15450091/for-a-newbie-error-2002-hy000-cant-connect-to-local-mysql-server-through-so プロを目指す人のためのRuby入門 2.8.3 ヒアドキュメンント 2.8.4 フォーマットを指定した文字列 2.8.5 文字列作成色々 2.10.2 真偽値 2.10.3 unless 2.10.4 case 2.10.5 Ternary operation(3項演算子) StackOverflowでよく見かける 2.11.1 argument with default value 2.11.2 methods ends with "?" 2.11.3 Methods end with ! (destructive method) その他 HTMLやCSSの描画を試すツールに使える https://www.w3schools.com/html/tryit.asp?filename=tryhtml_default

Linux

2019年09月09日(月)

5.5時間

投稿フォームの実装(ラジオボタンのグループを3つ作成する)

アプリ 投稿フォーム作成 紙に模写 HTMLコーディング 実現したいこと 5つのラジオボタンを1つのグループにして、グループを3つ作る。 1つのグループにづきそれぞれ1つのラジオボタンを選択し、POSTする。 (3つのグループをDiaryモデルの 各カラム(:activity, :mood, :appetite)にそれぞれ対応させたいです) 課題 1つのグループのラジオボタンを選択し、さらに他のグループのラジオボタンも同時に選択することができないこと。 name属性はグループごとに同じになるように設定してある。 <%= form_with model: Diary.new do |form| %>のブロックの中で form_tag系のメソッドを使用していることで、上記エラーが発生しているとメンターからアドバイスをいただいた。 そこで、form_tag系ではないメソッドでラジオボタンを生成したが、同様のエラーとなってしまった。 <%= form.label(:activity, "-2", value: "-2", class: 'btn btn-secondary') %> <%= form.radio_button(:activity, "-2") %> その他調べたり設定したこと atomでタブのインデント操作は cmd + "[" or "]" teminalでプロジェクトディレクトリに移動するエイリアスを設定 いままで時間を無駄にしていました!泣

Rails
HTML

2019年09月07日(土)

3.0時間

150件中の 126-150件 を表示