行動すれば次の現実

テック中心の個人ブログ

Rails

【Rails】Pumaのワーカー数、スレッド数とDB接続プール数の決め方

本記事では、Pumaのワーカー数、スレッド数の決め方、およびDB接続プール数の決め方と推奨値について解説します。 ワーカー数の決め方 基本的にはCPUの数に合わせることが推奨されます。 例えば、Herokuの場合、Standard-1XではCPU数が1なので、ワーカー数を…

Next.jsとRails APIのMonorepo管理とDockerを使った開発環境構築

フロントエンドにNext.js、バックエンドにRailsのAPIモードを採用した構成において、一つのリポジトリで管理するMonorepoの環境をDockerを利用して開発環境を構築する方法について解説します。 環境情報 セットアップ前のProcjectの構成 docker-compose.yml…

【Carrierwave+fog-aws】特定バケットへのアクセス権限を持ってS3にアップロードさせる方法

RailsアプリでS3にファイルをアップロードする場合、Carrierwaveとfog-awsを使用することが多いと思います。複数アプリをS3バケットを切り替えて使用する際に、ユーザーごとにバケットのアクセス権限を与えることで、思わぬ事故を防いだり、セキュリティを向…

Groverで非同期にPDFファイルを生成する方法 | Rails

PDFファイル生成GemとしてGroverはとても優秀なのですが、処理するデータ量によっては処理が重くなり、メモリ負荷やレスポンスタイムの懸念が付き纏います。 弊社プロダクトでも、もともと非同期処理でGroverを実装していなかったため、度々レスポンスが極端…

【CarrierWave + aws-fog】S3上のファイルをローカルにダウンロードする方法

CarrierWaveとaws-fogを用いてS3上にアップロードしたファイルをローカルにダウンロードする方法を説明します。 サイズの大きいファイルを一旦ローカルにダンロードしてから処理したいケースなどに活用できるかと思います。 実装 モデルの定義 class Invoice …

Asset Pipelineの本番モードと開発モードの挙動の違い

アセットパイプラインは本番環境と開発環境で挙動が違うと言われていますが、具体的にどのように違うのかを深堀りしてみました。 そもそも本番モード、開発モードとは? アセットパイプラインでは本番モード、開発モードで挙動が違うというのはRails開発者な…

inputファイル経由ではなく、アプリ内で作成したファイルをCarrierWaveで管理する方法

CarrierWaveの使用例として、inputファイルをアップロードしてModelとリンクさせるというケースが多いかと思います。 本記事では、inputファイルではなくRailsアプリケーションで作成したファイルをModelとリンクさせる方法を紹介します。 実装例 「Reportモ…

FTPに配置されたファイルを取り込む処理をRSpecでテストする方法

外部サービスとデータ連携する際に、FTPに配置されたファイルをローカルにダウンロードして、データを取り込むような処理を実装するケースは少なくないと思います。 当該処理のユニットテストを実装する場合、毎回リアルなFTPサーバーを使ってテストするのは…

Railsで簡単にPDFが出力できるGroverを導入してみた(Herokuへのデプロイも)

この記事では、Groverを使ってPDFを出力する際の導入方法や注意点を記載しております。また、Herokuへのデプロイについても説明します。 Groverとは? GroverとはGoogle PuppeteerとChromiumを使ってHTMLをPDFや画像ファイル変換するGemです。 RailsでGrover…

Sidekiqでスタータスチェックや進捗管理ができるsidekiq-statusの使い方

Sidekiqのステータスチェックや進捗状況管理に便利なsidekiq-statusの使い方について説明します。 sidekiq-statusとは sidekiq-statusの導入 sidekiq-statusのインストール sidekiq-statusの設定を追加 ジョブクラスにSidekiq::Status::Workerをinclude ジョ…

Sidekiqの引数とエラーリトライ時の挙動について

Sidekiqを使用するために知っておいてほしい、引数とエラーリトライ時の挙動についてまとめました。 引数のベストプラクティス Sidekiqのperform_asyncの引数をJSON形式でRedisに永続化します。 例えばモデルオブジェクト自体を引数に渡してしまった場合、デ…

Rails7(esbuild+stimulus)にdatepickerライブラリのflatpickrをインストールする

Rails7+esbuild+stimulusの構成でflatpickrを使えるところまでを説明します。 flatpickrのインストール yarn add flatpickr app/assets/stylesheets/application.scss // 下記を記載 @import 'flatpickr/dist/flatpickr'; app/javascript/application.js // …

覚えておくと便利な「rails db:migrate:xxx」「rails db:xxx」コマンド集

よく忘れてしまうのでメモとして残しておきます。 rails db:migrate系 rails db:migrate 未適用のmigrationを適用します rails db:migrate:down VERSION=20221003050833 VERSIONに指定されたmigrationを戻します self.downメソッドが実行されます rails db:m…

Rails7のimportmapでsemantic uiを使用する方法

Rails7のimportmapでsemantic uiを使用しようとしたところ苦戦したので備忘録として載せておきます。誰かのお役に立てば幸いです。 さっそく結論から 以下のように設定するとsemantic uiが使用できます。 Gemfile # これによりsprocketsでアセットを管理する…

Rails7+bootstrap+esbuld+Postgresqlの構成でDockerの開発環境を構築する

Docker-Composeを使ったRails7の開発環境構築手順を説明します。 意外にもDocker構築を含めた一筆書きのRails7セットアップ手順が見受けられなかったので自分で試行錯誤しながら記事にしました。極力シンプルな手順を心がけています。誰かの参考になれば幸い…

FTPでCSVファイルをダウンロードしてアプリに取り込む処理の実装例 | Rails

FTPサーバーに配置されたCSVファイルを使ってRailsアプリで処理する機会がありましたので、実装例について説明いたします。 net/ftpを使用した実装例 RubyでFTPサーバー接続するためにはnet/ftpというライブラリを使用します。 ftp = Net::FTP.new ftp.conne…

devise-token-authでemailではなくusernameでもログインさせる方法

email以外のキーを使った認証方法について、devise単体では同じような記事がいくつもありましたが、devise-token-authを交えた記事があまりなかったので作成しました。 How To: Allow users to sign in using their username or email address · heartcombo/…

Next.jsとdevise_token_authを使って認証周りを実装する

前回、Rails7 APIモードの認証機能をdevise_token_authで実装するという記事で、devise_token_authの導入方法や使い方を一通り説明いたしました。 今回はNext.jsとdevise_token_authを使ってログイン処理と認証制御周りを具体的な実装例を踏まえて説明します…

Rails7 APIモードの認証機能をdevise_token_authで実装する

Rails7 APIモードの認証機能を実装するにあたり、Deviseのトークン認証を可能にするdevise_token_authというライブラリを使用することにしました。 導入に少しハマったところなどもありましたので記事にまとめました。同じような構成を検討している方の参考…

Rails7+esbuild+TypeScriptで開発環境を構築する

Rails7のフロントエンド開発環境としてjsbundlingのesbuildを採用した際にTypeScriptの導入に少し手こずりましたので備忘録として記事にしました。参考になれば幸いです。 esbuildではTypeScriptの型チェックは行ってくれない esbuildはデフォルトでTypeScri…

Railsを5.2から6.0にバージョンアップする方法

この記事では、Railsをバージョンアップ(アップグレード)する方法を説明します。 バージョン5.2から6.0にアップグレードする手順を例にとって説明しています。 テストや確認の工程などは省き、なるべくシンプルな内容にしています。 Gemを最新状態にアップグ…

Axlsxで出力したExcelをRSpecでテストする方法

RubyでExcelのインポート、エクスポートを実装する場合は、Axlsxを使用することが多いかと思います。 Axlsxでエクセルをインポートする処理をRSpecでテストするというコードはよく見かけるのですが、 エクスポートに関してはあまり見たことがありません。 先…

Railsアプリが爆速になるパフォーマンスチューニング集

Railsアプリを速くするためのパフォーマンスチューニング集をまとめました。 これらの手法を用いることで、弊社アプリにおいて、今まで30秒ほど掛かっていた処理が1.5秒まで短縮することができました。 あくまでもアプリケーションレイヤーでできるパフォー…

Rails7でReactを使う場合はimportmapはオススメできない

Rails7からJavascriptバンドラーとしてNode.jsが非依存のimportmapが標準機能に採用されました。 早速、importmapを使ってReactを使用した開発を試みてみましたが、結論としてはimportmapは使用しないことになりました。 Reactの場合はimportmapをオススメで…

Herokuで可用性の高いサービスを運用するために入れておきたいアドオン3選 | Rails

弊社では多くのWebサービスをHeroku上で稼働させています。 初めてローンチした当初は数々のトラブルが発生して可用性が不安定な時期がありましたが、現在は可用性の高いサービス運用が実現できております。 それが実現できているのはアドオンのおかげと言っ…

既存のRailsアプリをHerokuにデプロイして本番稼働させるまでの手順

既存のRailsアプリをHerokuにデプロイして本番稼働させるまでの手順を説明します。 運用面を考慮した細かな設定も含みますので、公式ドキュメントよりも豊富な内容になっております。 1. Herokuで新しいアプリを作成する Heroku管理画面からCreate New Appし…

既存の開発環境をDocker化する手順 Rails6+Webpacker+Postgresql+Sidekiq

すでに稼働しているRailsアプリをDocker化する手順を紹介します。 Dockerの公式ガイドだけでは手順が不足している部分があったので、細かな部分も含め解説を加えています。 環境構成 Dockerfile docker-compose.yml .dockerignore entrypoint.sh config/data…

Webpacker3から5にアップグレードする方法 | Rails

最近、開発端末をMacBook Pro M1 Maxに乗り換えたところ、webpackのコンパイルが極端に遅くなりました。 思えばwebpack3のままメンテナンスを怠っていたので、これを機にwebpack4にアップグレードすることになりました。 Webpackerをv3からv5にアップグレー…

ScoutAPMのトレース情報にユーザーIDを付加する方法

ScoutAPMを使ってモニタリングしているとトランザクションとログインユーザー情報を紐付けたいと思ったことはありませんか? そのような場合は、ScoutAPMのCustom Contextという機能を使うことでトランザクションに対して付加情報を付けることが出来ます。 C…

RailsのLogにuser idを出力する方法

Ruby on Rails5でリクエストログにユーザーIDを追加する方法を説明します。 ミドルウェアの修正は不要ですので、気軽に取り入れることができると思います。 実装内容 config/initializers/logging.rb Rails.configuration.log_tags = [ :request_id, lambda …