複数前のコミットを統合する
直前のコミットを今書いているものと統合したいという場合でしたら、
git commit --amend でまとめ直すことはよくやっていたのですが、
複数前のコミットを統合してまとめ直すにはどうすればいいか分からず調べました。
その手順を書き留めておこうと思います。
①git logでまとめたいコミットの1つ昔のコミットIDをチェックします。
$ git log --oneline
876e111 (HEAD -> feature/164103006) コミット1
cb366ed コミット1.2
17a7b51 コミット2
c49e7d7コミット3
8531b84コミット4
3909d72 コミット5
a1ed513 コミット6
②git rebase -i <まとめたいコミットの1つ昔のコミットID> を実行します。
$ git rebase -i c49e7d7
すると、そのコミットより新しいコミットが以下のように
pick <コミットID> コミットメッセージ
という形で vimで開いて表示されます。
pick 17a7b51 コミット2
pick cb366ed コミット1.2
pick 876e111 コミット1
③ まとめてしまいたいコミットを、pickからfixupに変更します。
pick 17a7b51 コミット1fixup cb366ed コミット1.2
pick 876e111 コミット2
すると、まとめたいコミットがその1つ昔のコミットに統合されます。
もう一度 git log で確認してみると、以下のように統合されているのがわかります。
~/p/m/f/flatea (feature/164103006|✔) $ git log --oneline
82a60dd (HEAD -> feature/164103006) コミット1
3926380 コミット2
c49e7d7 コミット3
8531b84 コミット4
3909d72 コミット5
a1ed513 コミット6
javascriptで「もし 'cssのclass' が存在すれば」という条件をかく
InfiniteScrollを実装していた箇所で、以下のようなエラー文がコンソールに出てしまっておりました。
おそらくページネーションが無いときにも関数が呼ばれてしまっており、エラーが出ているようだと思い、InfiniteScrollを実装していた関数を呼ぶ部分で、条件を指定してあげれば良さそうだと思いました。
以下はその実装部分です。
$(function() {
$('#menus').infiniteScroll({
path : 'nav.pagination a[rel=next]',
append : '.col-md-6.p-2',
history: false,
prefill: true,
status: '.page-load-status'
})
})
$('#menus').infiniteScroll({ })の関数が呼ばれる前に、if (nav.paginationがある時) と条件を指定してあげれば良さそうだと思いましたが、その書き方がよくわからん。。。となりましたw
調べていたところ、以下の記事を参考にさせていただきました!
if ($('.pagination').length) { .... }
上記の書き方で、'もしpaginationというcssのクラスが存在すれば'、という条件がかけそうだと思い、
以下のように書いてみました。
$(function() {
if($('.pagination').length){
$('#menus').infiniteScroll({
path : 'nav.pagination a[rel=next]',
append : '.col-md-6.p-2',
history: false,
prefill: true,
status: '.page-load-status'
})
}
})
これで無事、コンソールのエラーも出なくなってくれました!!
ダウンロードtsvのテスト
「tsvファイルのダウンロードができる」というテストのやり方がわかりませんでした。
調べて試したところ、以下のような書き方で確かめることができるようです。
describe 'Hogeユーザーダウンロードtsv' do
it 'ダウンロードできる' do
visit admin_hoge_users_path
click_on 'ダウンロード'
expect(page.response_headers['Content-Type']).to eq("text/tab-separated-values")
end
end
text/tab-separated-valuesというのがtsvファイルのことをさしております。
Content-Typeヘッダーはクライアントに返されたコンテンツがどんな種類のものであるか伝えるものです。
検証ツールを使ってResponse Headersの中身を確認してみたところ、
きちんとContent-Type: text/tab-separated-values となっておりました!
Railsdmへ行った!!!
今日はRailsdmへ行ってきました!!!
とっても楽しかったです!!!
もし「初心者だから理解できなそう、楽しめるか不安」という人がいたら、「理解できてなくてもすっごく楽しいよ!!」と伝えたいですw
ただ残念なことにRailsdmは今回が最後とのこと。
しかし!!!
2020年にはRailskaigiを開催してくださるとの事でした!!
見に行ったセッションはどれも面白かったです!
特に感動したのが以下のスライドのセッションでした!!
歴史的な背景も踏まえ、Railsがなぜ小〜中規模の開発に向いているのか、規模が大きくなってくるといつ・なぜ限界が訪れるのか、と行った内容についてとてもわかりやすくお話ししてくださりました!!!
他にも面白い発表がたくさんありましたし、見れていないものも沢山です。。。!!
他の資料については上に貼った公式サイトのリンクから確認できます!!
自分もこれからいろんなスライド読んでいきたいと思います!!
雑な日記ですが、感動の余韻が消えないうちに書いておきたかったので書きました。。。!!
FactoryBotでtraitを使ってアソシエーション先のデータも作る
FactoryBotでアソシエーションが絡んだデータの事が今ひとつ理解できておりませんw
今日はtraitを使ってアソシエーション先のテストデータも作るということを覚えました。
そのやり方についてです。
ファクトリーを設定
通常のFactoryBotを用いたデータ生成の設定に加え、
trait ~ do ~ endのブロックで関連先のデータについても設定してあげます。
ブロックの中には以下のように、after(~) do |~| ~ endとさらにブロックを渡し、
データがbuildされたら呼ばれるようにしてあげます。
spec/factories/users_spec.rb
FactoryBot.define do
factory :house do
sequence(:address) { |n| "address_#{n}" }
sequence(:tel_number) { |n| "000-0000-00#{n}" }
trait :with_user do
after(:build) do |restaurant|
restaurant.restaurant_user = FactoryBot.create(:restaurant_user)
end
end
end
end
設定したファクトリーを使う
設定したファクトリーを使う際は、以下のようにcreate (以下の例ではcreate_list) の引数に、そのtraitも指定します。
すると、traitで定義したアソシエーション先を持ったテストデータが生成されます!
spec/system/xxxx/oooo/users_spec.rb
require 'rails_helper'
RSpec.describe 'xxxxxx', type: :system do
describe 'oooooo' do
let!(:houses) { FactoryBot.create_list(:restaurant, 25, :with_user) }
略
end
end
traitを指定しなければ関連先は作らないで済みますし、
traitを何個も作って使い分けることもできるようです。
感想
奥が深くてまだまだ未知な部分が多いですw
引き続き学んでいきます。
文字列取得してDate型に変換して整形する(javascript)
datepickerの{format: 'yyyy/mm/dd'}オプションを使って、日付の表示を整形している部分があったのですが、検索実行したりリロードしたりすると、'00:00:00 +0900'という余分な部分が表示されてしまっておりました。
直したいと思い、まずtext_fieldに対して日付のフォーマットを整えるオプションがあるかなと思い調べたのですがよくわからずでした。
rubyのstrftimeメソッドを使って、'Timeクラスのオブジェクト.strftime('yyyy/mm/dd')' で整形できるという情報はたくさん出てきたのですが、今回の場合はやりづらそうでしたのでjsで整形することにしました。
$(document).ready(function() {
$(".datepicker").datepicker({ format: 'yyyy/mm/dd'}); //datepicker使用&format指定
let date_gteq = $("#q_created_at_gteq").val(); // 日付取得して代入
let date_lteq = $("#q_created_at_lteq_end_of_day").val();
if (date_gteq != "") {
let date = new Date(date_gteq); // Date型に変換
let yyyy = date.getFullYear(); // 年の部分代入
let mm = date.getMonth() + 1; if (mm < 10) {mm = '0' + mm;} // 月の部分代入
let dd = date.getDate(); if (dd < 10) {dd = '0' + dd;} // 日の部分代入
let new_date_gteq = yyyy + '/' + mm + '/' + dd; // yyyy/mm/ddに整形
$("#q_created_at_gteq").val(new_date_gteq) // 値を入れ替える
}
if(date_lteq != "") {
let date = new Date(date_lteq);
let yyyy = date.getFullYear();
let mm = date.getMonth() + 1; if (mm < 10) {mm = '0' + mm;}
let dd = date.getDate(); if (dd < 10) {dd = '0' + dd;}
let new_date_lteq = yyyy + '/' + mm + '/' + dd;
$("#q_created_at_lteq_end_of_day").val(new_date_lteq)
}
});
これでリロードしても検索実行しても、yyyy/mm/dd というフォーマットのままでいてくれるようになりました!
その他追記
なんでgetMonth()は +1 しなきゃいけないんだ。。。?と思い少し調べてみました。
以下の記事がとても参考になりました!!
ネストした配列を平坦化
以下のように、whereで取得したレコードの配列をmapメソッドでアソシエーション先(1対多の多)のレコードの配列に変換したところ、配列の中に配列が入っている状態になってしまいました。
Hoge.where(name: argment).map{|r|r.fugas}
その後処理を続けるためには普通の配列に変換したいけど、どうすれば?
join(',') を実行しても一つの文字列になってしまうし。。。
と、思い調べていたところ、flatten メソッドというものを知りました!!
flattenメソッドとは
rubyの組み込みライブラリでArrayに対して使えます。
flatten は自身を再帰的に平坦化した配列を生成して返してくれます。
引数を指定して何段階まで平坦化するか指定もできます。
例
irb(main):004:0> [1, 2, 3, 4, 5, [6, 7, [8, 9]]].flatten(1)
=> [1, 2, 3, 4, 5, 6, 7, [8, 9]]
irb(main):005:0> [1, 2, 3, 4, 5, [6, 7, [8, 9]]].flatten
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
とても簡単に普通の配列にすることができました!
たまに配列の中に配列が入ってしまい困ることがあるので、そんな時はflatten使おうと思います。
参考リンク