これは何?
エンジニアブランク4年強(もう素人)の私が、エンジニア復帰後に、悩んだことや学んだことを定期的に記事にしていければと思い、書いているものになります。
同じような悩みに至った方や共感できる方はいいねいただけると嬉しいです!
※使用中の技術 Ruby on Rails / React(TypeScript)
※ブランクの期間は、マーケティングをしておりました。
~ Pager編 ~
ショッピングサイトでよく見かけるページ送りの処理を実装しようと思い、参考になりそうな他ページのプログラムを見つけにいく。(コピペ戦略です)
それっぽいの見つかりホッと一安心と思いきや
...
SNAPSHOTS_COUNT_PER_PAGE = 10
@item.snapshots.page(params[:page]).per(SNAPSHOTS_COUNT_PER_PAGE)
...
悩み
→ Active Recordの機能にpage / per なんてあったっけ?どっからこのメソッド出てきた?
→ そもそもControllerでのページ送りの処理この1行だけ?
→ 昔、PHPとかでpagerの処理は愚直に書いたことがあるので、下記みたいな総ページ数や現在のページ数などを取得する処理がどこかにあるはずと思っていた。
...
def total_page
@total_page ||= [(snapshots_count / SNAPSHOTS_COUNT_PER_PAGE.to_f).ceil, 1].max
end
def current_page
@current_page ||= params[:page].present? && params[:page].to_i.in?(1..total_page) ? params[:page].to_i : 1
end
..
答え
kaminari
というGemを使用していた。
→【rails】kaminariを使ってページネーションを作る - Qiita
感想
世の中には便利なGemがいっぱいあるなと思いつつ、プログラムの中でいきなり出てくると「どっから出てきた?」となってしまうので、今使用しているGemがどのような場面で使用されているのかのリスト(エクセルでもなんでも)があると開発効率が上がりそうと思いました。
~ 突然出てくるやつ編 ~
module ControllerConcerns
module ArticleFindable
private
# @return [Article]
# @raise [ActiveRecord::RecordNotFound]
def find_article!
article = current_user.articles.find_by!(uuid: params[:article_id])
fail ::Article::PermissionError unless article.try(:readable_by?, current_user)
article
end
end
end
前提
→ article_findable.rb というファイルに下記みたいな修正の pull request が届いたとします。
(実際にはこのような簡単な内容ではないです)
- article = current_user.articles.find_by!(id: params[:id])
+ article = current_user.articles.find_by!(uuid: params[:article_id])
悩み
→ current_user
とか params
とかって、どっから出てくるの?
答え
→ Controllerからincludeされることを前提に作成されているため、そちら側に current_user
が存在している。
感想
少し考えればわかるので、少し大袈裟に書いています。
include の他にも、 継承 / mix-in / extend など拡張の方法は色々あると思いますが、継承以外は、ある程度前提の知識がないと途端にプログラムが追いづらくなるのかなと思った次第です。
意図しないクラスから呼び出される場合もあると思いますし、個人的には、設計を工夫して可能な限り継承以外の拡張機能はあまり使いたくないなと思ってしまいました (慣れてきたら考えは変わるとは思います)
最後に
今後も躓いたポイントなどがあった際には、どんどん記事にしていこうと思っています。
また、まだ知識が浅いので、誤った表現などあれば指摘いただけますと幸いです。