開発ノート@HarikoApps

HarikoApps: https://hariko.sprkls.me

2024-09-21

[Rails]ActiveModel::Attributesを用いてモデルのコンポジションを行うためにひとまずカスタムタイプで対応する #20

Railsプロジェクトにて、ActiveModel::AttributesはDBのテーブルにデータを永続化しないモデルを作成するのにとても便利なのですが、オブジェクト指向設計でいうところのコンポジション(合成)のための機能は現状(v7.2.1)では備わっていません。Rails本体のIssueでこの機能のための作業が行われていてリリースが楽しみなのですが、最近このコンポジションを使いたい場面が出てきたので、Rails本体でのリリースまでどう乗り切ろうか...

2024-08-24

VS CodeでDev Containerを使い始めた #18

VS CodeにDev Container機能なるものがあることは知っていて何度かセットアップしようとしたことがありました。ただ導入したいプロジェクトがフロントエンドとバックエンドのモノレポ(Multi Root)構成のプロジェクトということもあり短時間ではうまくいかずでほぼあきらめかけていたんですが、連休で時間が取れたので改めて本腰を入れてセットアップしてみました。 Dev Containerとは? 最近のプロジェクトだとローカル環境のセットアッ...

2024-07-07

Vision Proの空間コンピューティングはとても楽な体験だった #13

日本でもVision Proが発売され、Apple Storeで体験できるようになったので早速表参道のストアで体験してきました。結果、空間コンピューティングはかなり良いものだという感触を得ました。 なにより操作が楽というのが第一印象です。この「楽である」ということはAppleがかなり意識しているところだと思います。Appleのエコシステムに入ってしまえばデジタルライフが楽になるというのは近年のApple製品の大きなセールスポイントですし、人間というの...

2024-07-06

Writebookのソースコードを読んだメモ #14

先日、37signalsから新しいONCEプロダクトのWritebookが発表されました!これはウェブ上で書籍を編集して公開するためのRails+Hotwireのアプリで無料で公開されています。もちろんソースコードもダウンロードできるので、早速アプリをローカルで動かしながらソースコードを見てみました。 初回リリースということもあるのかもしれませんが、全体としてとてもシンプルな実装になっていて、こんなに少ないコードでこれだけのことができるのかという驚き...

2024-06-21

ActiveModel::Serializers::JSON を使ったシンプルなシリアライザ #11

RailsでJSON APIを実装しているプロジェクトでシリアライザがなかったものにシリアライザを導入した際に、Railsに含まれるActiveModel::Serializers::JSONを用いたクラスを使ようにしてみました(確認環境:Rails 7.1.3.4)。 下記のようにベースクラスを定義し、適宜継承して使うような実装にしました。ドキュメントにattributesメソッドを定義するように書かれているのでそれに従い、簡潔に書けるようにex...

2024-06-15

highlight.jsを用いてActionTextにもシンタックスハイライトを導入する #nobuild #10

ActionTextではTrixというエディタが使われているのですが、Trixには標準ではシンタックスハイライトの機能は備わっていません。そこでhighlight.jsを用いてシンタックスハイライトを導入してみました。検証環境は以下のようになり、importmap-railsを用いたNo Buildな環境になります。 • Rails(ActionText) 7.1.3.4 • importmap-rails 2.0.1 • turbo-r...

2024-06-13

RailsのロケールファイルにはRubyファイルも使える #9

普通にRailsアプリを作っているとあまり利用することはないかもしれませんが、実はRailsのI18nのロケールファイルには.rbファイルも使えることを知りました。.rbファイルのevalはここで行われています。 bindingにはI18n::Backend::Baseをincludeしたオブジェクトが設定され、ロケールの.rbファイルはI18nバックエンドオブジェクト(デフォルトではSimple)でevalされます。 このI18nバ...

2024-06-10

サーバに状態が集約されることのありがたみ #8

Zennの別館に次のような記事を書きました。 Microsoft Graph API OAuth2でSPAから認証フローを開始してバックエンド(Rails)でWebアプリ用トークンを受け取る この作業には調査含めて数日かかってしまったのですが、Rails+HotwireならバックエンドのOmniAuth導入だけで済むため半日かからずに終えられてしまう作業だと思います。こういうことがあるとHotwireのようにサーバサイドに状態が集約さ...

2024-06-09

Railsアプリのコントローラーをどのように書けば良い? #7

Railsアプリのコード整理ではまずMVCの境界を意識するのが良い #6ではMVC境界を意識することの重要さについて書いたのですが、MVCのうちコントローラーをどのように書くべきか簡潔に説明しているツイートを見かけました。以下は筆者による日本語訳です。とてもわかりやすい! “混乱したRailsコントローラーになるのは次のような場合です。 1. ビューがどのように見えるかを決定しようとする。どのビューを使うか、ビューにどんなデータを渡すか...

2024-06-09

Railsアプリのコード整理ではまずMVCの境界を意識するのが良い #6

仕事柄色々なRailsプロジェクトに触れる機会があるのですが、途中からJoinしたプロジェクトでコード整理に課題があるなと感じるとき、多くの場合MVCの境界違反が見られます。よくあるのはControllerにビジネスロジックを書いてしまうといういわゆる 「Fat Controller」ですが、他にはモデルにビュー用のロジックが含まれていたり、ビューにドメインロジックが混在している場合もあります。 このような場合に意識するべきはやはりまずは...

2024-06-07

VSCodeのVim環境はVSpaceCode拡張機能に一旦落ち着いた #5

僕はVimキーバインドのファンなのですが、エディタ自体はGUIのものを使いたくて快適に作業できる環境を求めて色々な変遷を辿ってきました。最近はiPadでCodespacesを使って外出先でもコードが書けるようにと2,3年前にVSCodeに移行しました(Codespacesは実際にはあまり使えてないですが😅)。 そこで必要になってくるのがVSCodeのVim環境なのですが、この用途では最もよく使われいてるであろうVSCodeVim拡張機能...

2024-06-06

VSCodeで任意のシェルコマンドを新しいエディタビューで実行する(拡張機能は使わずに) #4

VSCodeはカスタムすれば割と快適ではあるのですがUnixコマンドとの統合がいまいちです。Emacsだと M-! のようなコマンドで簡単にエディタから直接シェルコマンドを実行できるのですが、VSCodeだとそこまで簡単にはいきません。今回lazydockerというDockerコンテナを簡単に管理できるコマンドをVSCode内で扱いたいと思い、Emacsのようにエディタのビューの中で実行できないか調べてみました。 まず、VSCodeのコ...

2024-06-05

37signalsブログの「Code I like」シリーズがとても良い #3

Railsのアプリを作っていて簡単なCRUDくらいまでならチュートリアルなどの内容で難なくこなせるのですが、ある程度複雑なロジックを組んでいこうとするとコードの設計に迷う時が必ずやってきます。そんな時にブログ記事を読んだり著名なOSSを参考にすることはよくあります。Railsコミュニティの中でさまざまな技法が編み出されそれが共有されていることはとても素晴らしいなあと思います。 ところで今までRailsの作者であるDHHが所属する、いわば...

2024-06-04

Railsで特定のカラム値にスコープされる連番付与のConcernを書いた話 #2

Railsで特定のカラムの値にスコープされる連番をアプリに設けたいなと思いました。このブログがまさにそうなのですが、今までは記事にグローバルなIDを使っていてそれでも不都合はそこまでないですが、ブログごとに記事のIDを採番したほうがどのブログの何番の記事というのがわかりやすくなりそうです(GithubのプルリクのIDのようなものをイメージしています)。 class Post < ActiveRecord::Base belongs_to :blo...

2024-06-02

Rails PartialのStrict Localsはどうやって実装されているのか? #1

Rails7.1からViewパーシャルのStrict Localsという機能が入りました。どういうものかというと、 <%# locals: (title:, comment_count: 0) %>のように書くと、 renderで呼び出された時にパーシャルに引数として渡されるローカル変数をチェックしてくれるというものです。 今まではデフォルト値を使いたい時なんかは、 <% comment_count = local_assigns[:co...