気ままに気ままのエンジニアブログ

定期的に得た知見を気ままに発信中

【Rails/kaminari】ページネーションで起こった2つのバグを解消した話

こんにちは。

今年は例年と比べ、梅雨が早いらしいです。あーまた髪のうねる時期か。。

どうも天パのハチマキです。

はじめに

今回は、ページネーション関連の「バグを解消した話」と「解消に至った実装方法」を合わせて紹介したいと思います。

UIイメージ

最初に簡単にUIのイメージをお伝えしたいと思います。
こちらはgithubのものですが、イメージとしてはこれらの各タブ内にページネーションがあり、どれもkaminariのgemが使われております。


何が問題だったのか?

各タブ内にページネーションが設置されることで、ページネーションをクリックすると、

  • 1つ目:すべてのタブのページネーションが効いてしまう
  • 2つ目:タブの先頭に遷移してしまう

このような問題を抱えておりました。
イメージ画像を例にすると、例えばCommitsタブ内のページネーションの2ページ目をクリックすると、「各タブのページネーションが2ページ目になる」、且つ「Converationタブに遷移」してしまうという問題です。

解消するために何をやったか?

  • バグ調査
    • ページネーションの仕組みをあまり理解できていなかったため、まず仕組みの理解を行いました。どこでどのような使われ方をしているのか、どのように実装されているのかを画面操作と共に調査しました。
    • 調査を行う過程で、問題を捉えることができたものの、2つの問題を1つと捉え、実装方法を模索してしまいました。問題を分解し、2つの問題と捉えることができていれば、各々の実装方法が早期に見つかったなぁと反省しました。
  • 1つ目の実装方針の模索:すべてのタブのページネーションが効いてしまう
    • 「すべてのタブのページネーションが効いてしまう」問題を調べると、「対象パラメータにkeyを付与」することで実現できることがわかりました。
  • 実装方法

html.erb

# 修正前
<%= paginate @test %>

# 修正後
# 各種タブを引数に定義
<%= paginate @test, param_name: test_page(tab)%>

helper.rb

def test_page(tab)
    page = {
      'test1' => 'test1_page',
      'test2' => 'test2_page',
      'test3' => 'test3_page'
    }
    page[tab_type]
end

controller.rb

# 各タブで取得するパラメーターを定義する
# 定義方法は設計の仕方により異なりますが、helper.rbで定義した値を受け取るように実装しました
params[:test1_page]

params[:test2_page]

params[:test3_page]


上記のように実装することで、パラメーターが定義したキー名に変わります

# 変更前
page=2

# 変更後
test1_page=2
test2_page=2
test3_page=2

これで1の問題は解消できました。

  • 2つ目の実装方針の模索:タブの先頭に遷移してしまう
    • 解決策を模索しておりましたが、なかなか検討が掴めず苦しみました。なぜならこの問題を「kaminariのgem絡みの問題」だと思ってしまっていたからです。つまり、kaminariとは別の問題と捉える必要がありました
    • 結果的に先輩エンジニアに質問し、解消しました(神です..)。実装方法は「tabのパラメータを追加する」です。
  • 実装方法(各タブタイプは定義済みとします)

html.erb

# 修正前
<%= paginate @test, param_name: test_page(tab)%>

# 修正後
<%= paginate @test, param_name: test_page(tab), params: { tab: tab }%>

こうすることで、tabを持ったパラメーターに変わります

# 変更前
test1_page=2

# 変更後
test1_page=2&tab=tab1

これで2の問題も解消できました。

最後にまとめ

問題を正確に捉える

何が問題かを的確に捉える。当たり前かもしれませんが、問題として定義したものを解消するため、ここがずれるとそりゃ解消できませんね。。改めて学びました。

結局質問は神

自分で考えることも必要(調査することが理解は格段に上がります)ですが、やっぱ質問することで解消に至れるスピードは格段に上がりますね。。

【Git】git rebase -f で複数commitをまとめる

こんにちは。

夏に近づいてきました。
夏といえば、夏だ!プールだ!サマーランドだ!
こんなキャッチーな命名の付け方を教えてほしい...

どうもハチマキです。

はじめに

PRのルールとして、1 function, 1commitを原則とした開発チームで開発をしております。
そのため、不要なcommitをまとめる必要があり、その際に初めてgit rebaseを活用しました。

やりたいこと

複数のcommitを1つにまとめたい

実行コマンド

% git log #まとめるコミット数を確認する
% git rebase -i HEAD~3 #まとめたいcommit数をHEAD~の数字に記述
※こちらを実行すると、以下のようなテキストが現れます。まとめたいcommitを「pick」から「squashに修正(sでもOK)」→保存

修正前
pick aaaaaa テストの追加
pick bbbbbb タイポ修正
pick cccccc 一覧画面改修

↓↓↓↓

修正後
pick aaaaaa テストの追加
s bbbbbb タイポ修正
s cccccc 一覧画面改修

※「bbbbbb」と「cccccc」を「aaaaaa」にまとめる

#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

------------------------------------------------

% git log #commitが一つにまとまったことを確認

% git push origin ブランチ名 #既にcommitしているものがあると、rejectedが発生します。
To https://github.com/.......
 ! [rejected]            
error: failed to push some refs to 'https://github.com/.......
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

#rejectedが発生した場合は、オプションの-fをつける(強制的に書き換える)
% git push -f  origin ブランチ名 

これだけです。

【業務効率】ターミナルで使うコマンドをalias設定したら幸せになった話

こんにちは。

また記事更新を頑張ろうと誓った7日の夜。

どうもハチマキです。

はじめに

私は普段Railsを使って開発を行なっておりますが、毎度rails sとかbundle installとかgit statusとかgit branchとか打つの非常にめんどくさいなぁと思い、何か楽にする方法がないか調べてみたところ、ターミナルで使うコマンドのエイリアス設定があることを知りました。

ので、本日はその話を記事にしていきます。
具体的に設定する前と後の状況や実際設定してみてどうだったかなども合わせて書いていきたいと思います。

最初にaliasの設定方法から!

①自分のホームディレクトリにターミナルで移動し、.bashrcファイルを開く

$ cd $HOME
$ cd vim .bashrc 

②開いた.bashrcファイルにエイリアスを定義する
vimの入力方法
i:入力可能にする(書き換えられます)→以下を例にaliasを設定する→esc:修正状態を補完→:(コロン)を押してwq(修正内容を保存)→return

#以下、一例です
#rails command
alias ll='ls -la'
alias rs='rails s'
alias rs4='rails s -p 4000'
alias rc='rails c'
alias cre='rake db:create'
alias mig='rake db:migrate'
alias rol='rake db:rollback'
alias seed='rake db:seed'
alias drop='rake db:drop'
alias rr='rake routes'
alias bi='bundle install'
alias be='bundle exec'

#git command
alias gs='git status'
alias gd='git diff'
alias gb='git branch'
alias ga='git add'
alias gc='git commit'
alias gp='git push'

#docker command
・
・
・

③.bashrcを読み込み変更を反映させる
※各ターミナルのタブごとに実行が必要です。

$ source ~/.bashrc

これで定義したエイリアスを使用できるようになります。

これまでrails sとコマンドを打っていたものが、rsで実行できます。
これまでbundle installとコマンドを打っていたものが、biで実行できます。
これまでgit statusとコマンドを打っていたものが、gsで実行できます。
これまでgit branchとコマンドを打っていたものが、gbで実行できます。

最高すぎませんか!!?
次にこのエイリアス設定で何が変わったのかをこの後に載せておりますので、ご興味ある方はこのままお進みください。

設定前の実行状況

  • ターミナルを開く
  • コマンドを入力
  • 実行
  • エラーが出る
  • 一旦コマンドを思い返す
  • 悩む
  • 悩む
  • 悩む
  • 思い出せない
  • メモを探す
  • 見つからない
  • やっとメモを確認する
  • メモに記載のある実行コマンドをコピペ
  • コマンドを貼り付ける
  • 実行

設定後の実行状況

  • ターミナルを開く
  • $ source ~/.bashrcを実行
  • aliasコマンドを実行(忘れたらcatコマンドでvimを開きコマンド思い出す)

変わったこと

圧倒的に作業効率が増しました!コマンド自体の実行は、正直大した作業ではありませんが、長ったらしいコマンドなどを思い出しながら実行していたり、悩んだり、そして結局思い出せなかったらメモしたコマンドをコピペして実行するなど、思い返すと結構時間を使っていた気がします。

1日あたり数分の作業かもしませんが、月/年にすると結構な時間を削減できます。また、メモを探す手間などで感じるストレスがマジでなくなるのでおすすめです。

まとめ

劇的な変化はないかもしれませんが、alias設定はぜひおすすめです!
なぜなら作業効率はもちろん、良い派生効果を得られるからです。
設定は簡単なので、ぜひ使ってみてください。

bashrcについての補足

bashrcの用途:

※.bashrcの「rc」は「run command」の略だそうです。
bit Frequently Asked Questions [UNIX] 1

※bashrcとbash_profileの違いについては、参考資料を載せておきます。

【Git】ミスってpushしたcommitを打ち消す方法

こんにちは。

出会いの春がやってきました。

どうもハチマキです。

はじめに

やべっgit push間違えてやっちまった....
こんなシーンたまーにあると思います。僕は3年目にして初めてやりました。はい、ということは3年目にして初めて調べたことなので、初歩的なことかもしれませんが、解消方法について書いていきます。

やりたいこと

不要なcommitを打ち消したい
fixというcommitを打ち消します。
f:id:hachimaki37:20220407222135p:plain

実行コマンド

※打ち消すと言いつつも正確にいうと、打ち消した履歴は残します。

% git log  ※commit idを確認する
% git revert <logで確認したcommit id>
% git push origin branch名

実行結果
f:id:hachimaki37:20220407222009p:plain

これだけです。

                                            • -

エンジニア3年目になりましたが、日々勉強です。
以上、ハチマキでした。

【解消方法あり】The unauthenticated git protocol on port 9418 is no longer supported.は、GitリモートがSSHまたはgit://を介して接続しているユーザのみ影響ができるエラーだった

こんにちは。

久しぶりの更新です。

どうもハチマキです。

はじめに

以下事象が発生したため、解消に調査を行いました。その調査結果をまとめております。

事象

Travis CIで走る自動テストが急に通らなくなった

エラーログ

$ bundle install --deployment --without development production --jobs=4
The git source `git://github.com/〇〇/comfortable-mexican-sofa.git` uses the `git` protocol, which transmits data without encryption. Disable this warning with `bundle config git.allow_insecure true`, or switch to the `https` protocol to keep your data secure.
The git source `git://github.com/eLocal/mobylette.git` uses the `git` protocol, which transmits data without encryption. Disable this warning with `bundle config git.allow_insecure true`, or switch to the `https` protocol to keep your data secure.
The git source `git://github.com/esminc/seory.git` uses the `git` protocol, which transmits data without encryption. Disable this warning with `bundle config git.allow_insecure true`, or switch to the `https` protocol to keep your data secure.
The git source `git://github.com/〇〇/〇〇.git` uses the `git` protocol, which transmits data without encryption. Disable this warning with `bundle config git.allow_insecure true`, or switch to the `https` protocol to keep your data secure.
Fetching gem metadata from https://rubygems.org/.......
Fetching git://github.com/〇〇/comfortable-mexican-sofa.git
fatal: remote error: 
  The unauthenticated git protocol on port 9418 is no longer supported.
Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.
・
・
・
has failed.

The command "eval bundle install --deployment --without development production --jobs=4 " failed 3 times.
The command "bundle install --deployment --without development production --jobs=4" failed and exited with 11 during .

Your build has been stopped.

検索内容

The unauthenticated git protocol on port 9418 is no longer supported.

原因/問題

SSHまたはgit://を介して接続していたため、影響があった
※これがヒットし、原因を特定できた
github.blog

解消方針

Gitプロトコルをgit://からhttps:// に置き換える
参考資料:
naari.hatenablog.com

手順

1. Gemfileに以下コードを追記する

git_source(:github) { |repo| "https://github.com/#{repo}.git" }

2. ターミナルで以下を実行する

$ bundle install --no-deploymentを実行する ※https:// に置き換わる

-  remote: git://github.com/eLocal/mobylette.git
+  remote: https://github.com/eLocal/mobylette.git
・
-  remote: git://github.com/esminc/seory.git
+  remote: https://github.com/esminc/seory.git
・
・

以上です。お疲れ様でした。

【Git】「デプロイしたPR前のソースコードに巻き戻す」やり方

こんにちは。

お久しぶりの更新です。お元気しておりますでしょうか。

どうもハチマキです。

はじめに

一度デプロイしたPRをデプロイする前の状態(ソースコード)に戻したい!!そんなシーンございませんか?

例えば、
・新機能をリリースしたけどやっぱり成果でなかったから元の状態に戻したい..(私はこちらで表題の件を行いました)
・デプロイしたけど、不具合発生したから元の状態に戻したい..
などなど

元のソースコードに、戻すためには手作業でないとできないのだろうか??でも戻すのはめちゃくちゃめんどくさくい..
そんな時に以下コマンドを実行するだけで、PR前のソースコードに巻き戻すことが出来ます!

やりたいこと

デプロイしたPR前のソースコードに巻き戻したい

実行コマンド

git revertを実行し、PR切り戻しを行います。*手順は下記の形で実施

$ git pull origin master  *masterブランチを最新にする
$ git checkout -b test_branch *作業ブランチを作成する
$ git log *元に戻したい対象のコミットIDをコピペする
$ git revert -m 1 *コミットIDをペーストする

これらコマンドを実行すれば、修正前のソースコードに復元出来きます。
*その後、pushまでの手順を踏む

$ git add 
$ git commmitt -m 'コード復元'
$ git push origin test_branch

これでgithubにpushされることでしょう。
お疲れ様でした。

【Rails】任意のパラメータが入ったURLに画面遷移させるやり方

こんにちは。

夏がやっと来ました!さいクゥ〜

どうもハチマキです。

はじめに

画面遷移を実現するため、普段下記のように使っているlink_to。
これは至ってシンプルな画面遷移です。

・例1
= link_to 'yahooサイトへGO', 'http://www.yahoo.co.jp/', title: "yahooサイト", class: 'desc-center'

・例2
= link_to 'login_path', title: "ログイン", class: 'desc-center', target: '_blank' do
  ログイン
  %br
  画面
    
・例3
= link_to 'http://www.yahoo.co.jp/', title: "yahooサイト", class: 'desc-center' do
  = image_tag 'imgae/yahoo-logo'

今回ある検索結果を遷移先に定義したいと思ったのですが、やり方に迷いました。
そのため、色々調べた結果、新たな学びがあったので今回まとめていこうと思います。

環境

任意のパラメータが入ったURLに画面遷移させるやり方

早速ですが、まず初めにこちらから。こんな感じのURLに遷移させます。

https://〇〇/users?group_id=1?team_id=2

画面遷移の方法は、link_toのpathの引数にパラメータを定義することで実現できます。

*こんな感じ
= link_to users_path(group_id: 1, team_id: 2)

*こんな感じ
= link_to users_path(group_id: 1, team_id: 2), target: '_blank' do
   = image_tag 'imgae/yahoo-logo'

上記は至ってシンプルですが、「%5B%5D=〇〇」、「%3A」などが加わったURLに遷移させたい場合にどう定義するのか?となりました。
ここが+αで学べた点です!!

「%5B%5D=〇〇」、「%3A」⇦これらが何かというと、URLのエンコードでそれそれ記号などの意味を持ちます。

以下、URLエンコードの一例

  • ? → %3F
  • @ → %40
  • [ → %5B
  • ] → %5D

参考:TECHNICAL MANUAL

例えばこんなURLが生成されていたら?

https://〇〇/users?group_id%5B%5D=1&team_id%5B%5D=2

上記エンコードを参考に記述してみると、以下のような引数になります。

こんな感じ
= link_to users_path(group_id: [: 1], team_id: [: 2])

こんな感じ
= link_to users_path(group_id: [: 1], team_id: [: 2]), target: '_blank' do
 = image_tag 'imgae/yahoo-logo'

突然ですが、ここでもう一つ例を。

Q. 以下、パラメータを持つURLですが、どのようにlink_toを定義すれば、生成できるでしょうか。?

https://〇〇/?visit_date=2021-07-17&visit_time=19%3A00&expand_visit_minutes=60&num_guests=2

A. おそらくこんな感じじゃないかなと!(答えはわかりません..)

= link_to 〇〇_path(visit_date: '2021-07-17', visit_time: '19:00', expand_visit_minutes: '60', num_guests: '2')

まとめ

本日のポイントのまとめです。これらがわかってしまえば簡単なものです!

  • 任意のパラメータが入ったURLに画面遷移させるやり方は、pathの引数にパラメータを定義する!
  • %5B%5Dは、エンコードで変換されてるだけなので、調べればすぐ解決!怖くない!

以上、お疲れ様でした。