7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ブランクありのエンジニアが現場復帰して躓いたこと part.1

Posted at

これは何?

エンジニアブランク4年強(もう素人)の私が、エンジニア復帰後に、悩んだことや学んだことを定期的に記事にしていければと思い、書いているものになります。
同じような悩みに至った方や共感できる方はいいねいただけると嬉しいです!
※使用中の技術 Ruby on Rails / React(TypeScript)
※ブランクの期間は、マーケティングをしておりました。

~ Pager編 ~

スクリーンショット 2022-09-17 12.28.47.png

ショッピングサイトでよく見かけるページ送りの処理を実装しようと思い、参考になりそうな他ページのプログラムを見つけにいく。(コピペ戦略です)
それっぽいの見つかりホッと一安心と思いきや

SnapshotsController.rb
...

SNAPSHOTS_COUNT_PER_PAGE = 10
@item.snapshots.page(params[:page]).per(SNAPSHOTS_COUNT_PER_PAGE)

...

:thinking: 悩み
→ 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

..

:ok_woman: 答え
kaminari というGemを使用していた。
【rails】kaminariを使ってページネーションを作る - Qiita

:thinking:感想
世の中には便利なGemがいっぱいあるなと思いつつ、プログラムの中でいきなり出てくると「どっから出てきた?」となってしまうので、今使用しているGemがどのような場面で使用されているのかのリスト(エクセルでもなんでも)があると開発効率が上がりそうと思いました。

~ 突然出てくるやつ編 ~

article_findable.rb
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

:information_desk_person: 前提
→ article_findable.rb というファイルに下記みたいな修正の pull request が届いたとします。
(実際にはこのような簡単な内容ではないです)

- article = current_user.articles.find_by!(id: params[:id])
+ article = current_user.articles.find_by!(uuid: params[:article_id])

:thinking: 悩み
current_user とか params とかって、どっから出てくるの?

:ok_woman: 答え
→ Controllerからincludeされることを前提に作成されているため、そちら側に current_userが存在している。

:thinking:感想
少し考えればわかるので、少し大袈裟に書いています。
include の他にも、 継承 / mix-in / extend など拡張の方法は色々あると思いますが、継承以外は、ある程度前提の知識がないと途端にプログラムが追いづらくなるのかなと思った次第です。
意図しないクラスから呼び出される場合もあると思いますし、個人的には、設計を工夫して可能な限り継承以外の拡張機能はあまり使いたくないなと思ってしまいました (慣れてきたら考えは変わるとは思います)

最後に

今後も躓いたポイントなどがあった際には、どんどん記事にしていこうと思っています。
また、まだ知識が浅いので、誤った表現などあれば指摘いただけますと幸いです。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?