Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails

Ruby on Rails: ダイレクトルーティング(Direct routes)を使って外部サイトのURLをroutesで管理する

OAuthを利用した外部サイトへの認証時のリダイレクトやLPへの導線等、Webサービス内で外部サイトのURLを扱いたいときにRailsのダイレクトルーティング機能を使うとURLの管理をRoutesに統一できて便利だったのでMEMOしておきます ダイレクトルーティング機能…

個人のWebサービスをRuby 3.0アップデートしたので対応したこととかMEMO

2020/12/25にRuby 3.0.0がリリースされました✨ www.ruby-lang.org Ruby on Rails(6.1.1)製の個人のWebサービスを今更ながらRuby 3.0にアップデートしました。 update後に一部CI等が落ちて対応した点があったので対応したことをMEMOしておきます 対応したこと…

Ruby on Rails: 6.1.0の新機能strict_loadingを使ってN+1を防ぐMEMO

Rails 6.1.0で導入されたstrict_loadingを使うと手軽にN+1のチェックが出来て便利そうなのでMEMO 基本的には以下のような形でActiveRecord::Releationを作るメソッドチェイン内でstrict_loadingを呼び出すようにすると、 def index @feeds = Feed.strict_loa…

OmniAuthのDeveloper Strategyを使って開発環境でOmniAuthを使った認証を試すMEMO

Twitter等の外部アカウントの認証を開発環境で試すのは秘匿情報を本番と開発環境で分けたり等、色々考慮することが多くて面倒だと思うのですが、OmniAuthのDeveloper Strategyを使うと簡単にOmniAuthを使った認証処理を試せそうなので使い方とかをMEMOしてお…

Ruby on Rails: Webpackerのビルド時にSourceMapを無効化してビルド時間を短縮するメモ

開発環境でWebpackerのbuildが遅くてちょっと開発効率が落ちるみたいなことって、あると思うのですが、その際にSourceMapの生成をやめると割と早くなりそうだったので、そのへんをメモしておきます WebpackerでSourceMapの生成をやめる どれくらいビルド時間…

Ruby on Rails × LighthouseをCircleCIからGithub Actionに移行するときのMEMO

今回は以下で作成したCircleCI上で実行するRuby on Rails × LighthouseをGithub Actionsに移行したので、その辺のハマったところとかのポイントをメモしておきます madogiwa0124.hatenablog.com 移行する際のポイント デフォルトでinstallされているもの 使…

RubyonRails: WebpackerなRailsアプリケーションでSourceMapをRollbarにアップロードするMEMO

WebpackerでRailsアプリケーションでエラー管理にRollbarを使用しているときに、デフォルトだとエラーが発生してもminify等がされたjsにリンクされてしまい何が起きているのか、よくわかりません。。。 そんなときにSourceMapをRollbarにアップロードすると…

Ruby: camelCase🐫を使ってRubyを書くことは出来そうなのか?色々試してみたのでMEMO🤔

フロントエンドでJavaScriptを採用してバックエンドをRubyで書いていると、snake_caseとcamelCaseを行ったり来たりして、混乱したりするのでRubyでcamelCaseで書けたりしないのか、ちょっと試してみたのでMEMO やりたいこと method_missingを使って無理やり…

MarkdownからRspecにリアルタイムで変換するWebエディタを作った + ActionCableの使い方メモ📝

ActionCableと前に作ったMarkdown形式のテキストをRSpec形式のテキストに変換するgemを使ってリアルタイムに変換できるWebエディタを作りました https://markdown-to-rspec-web.herokuapp.com/ ↓Markdown形式のテキストをRSpec形式のテキストに変換するgemに…

Ruby on Rails: Asset Pipelineを使わないwebpackなRailsアプリケーションをHerokuでデプロイする

個人アプリの開発ではHerokuを使うことが多いのですが、最近webpack + Railsの環境を使っていてデプロイまわりで少しハマったので、デプロイ方法をメモしておきます Herokuのデプロイついて Herokuによる標準のRailsデプロイ WeboackなRailsをHerokuにデプロ…

Ruby: ActiveSupportコア拡張を使って任意の定数を持たない特定のクラスを継承したクラスを見つける

ライブラリのバージョンアップ等で親クラスが子クラスが持つ特定の定数に依存するようになりエラーが発生することがあり。。。 特定のクラスを継承したクラスの中で特定の定数を持たないクラスを探すコードを書いたのメモしておきます サンプルコード 任意の…

Ruby on Rails: WebpackerからピュアなWebpack環境に置き換えるメモ📝

最近個人のRailsアプリケーションをWebpackerからSimpackerを使ったピュアなWebpack環境に切り替えたので、その手順をメモしておきます 今回はWebpackerを導入しときのデフォルトなjs/scssなbuild環境を削除して、Webpackで置き換えていきます。 Webpackerを…

Ruby on Rails: deviseが使用する項目とユーザー情報のモデルを分離して肥大化を抑制するMEMO

最近deviseをちょっと触ってて自分が特に何も考えずに使っていくとUserモデルがどんどん肥大化していってしまうなぁと思い、、、 deviseのために追加する項目(email, encrypted_password等)とプロフィール的な項目(nickname, birthday等)でモデルを分けると…

Lighthouse CIとCircleCI ArtifactsでRailsアプリケーションのLighthouseのスコアを計測するMEMO

フロントエンドまわりの改善の指標としてLighthouseを使ってパフォーマンス等のスコアを参考にすることがあるかと思うのですが、 なかなかchromeで開いて手動で測定するのは手間だったのでCircle CIで実行して結果をArtifactsで確認できるようしたら結構良か…

Ruby on Rails: リクエストのformatによって実行するControllerを分岐させるroutesの設定方法MEMO

Ruby on Railsでエンドポイントを変えずにformatで実行するControllerを分ける方法でちょっと悩んだので解決方法をメモしておきます。 やりたかったこと 解決方法 おわりに 参考 やりたかったこと 個人のサービスでRSS用のXMLを表示するのと普通にHTMLを返却…

SimpleCovとCircleCIのArtifactsを使ってカバレッジ測定結果を確認するMEMO

rubyを使ったアプリケーションのテストコードのカバレッジ測定にはSimpleCovを使うことが多いと思いますが、CircleCIのArtifactsを使うと簡単にCircleCIの管理画面上でSimpleCovの結果を確認できたので、そのへんの手順をメモしておきます github.com Codeco…

Ruby on Rails: cssの管理をAssets PipelineからWebpakerに移行するときのメモ

個人のアプリケーションを今まではデフォルトのアセットまわり(CSS等)をSprockets、JavaScriptをWebpackerでビルドするような形にしてたのですが、 今回はstylesheetをWebpackerで管理するようにしたので、そのへんの手順をメモしておきます 対応したアプリ…

Webpacker 5.1以降で.vueファイルをbuild時にTypeScriptの型チェックを実行する方法MEMO

Webpackerのversion5.1からts-loaderではなく、@babel/preset-typescriptを使うようになりました✨ github.com これによりwebapckのbuild実行時の型チェックをfork-ts-checker-webpack-pluginを使うように変更になりました github.com しかし、デフォルトだと…

Ruby(with ActiveSupport)で指定日が第何、何曜日かを取得するときのMEMO

第2、第4火曜日だけなんかしらの処理を実行したいとき等、指定日が第何火曜日を知りたいケースの場合に、RubyとかActiveSupportにこういう系のメソッドが無いかなと思ったんですが、 曜日判定は出来ても第何曜日の判定を行うようなメソッドは見当たらず、ち…

ActiveRecord::QueryMethods#whereで発行されるwhereの部分だけのSQLを取得するMEMO

はじめに 下記のような形でActiveRecordが発行するSQLからWHERE句の部分のSQLだけを取得したいケースがあり、色々やり方とか調べたのでMEMO✍ はじめに やりたかったこと where部分だけのSQLを取得する方法 参考 やりたかったこと 今回やりたかったのは、下記…

`ActiveRecord::Relation#explain`を拡張してJSON形式のEXPLAIN結果を取得出来るgemを作った💎

前に下記の記事で紹介したActiveRecord::Relation#explainでJSON形式を取得出来るモンキーパッチを紹介したのですが、 今回はそれをGemとして公開したのでそれについて書きます✨ madogiwa0124.hatenablog.com Gemはactive_record_json_explainとしてRubyGems…

ActiveRecordにモンキーパッチを当ててJSON形式のEXPLAINを取得出来るようにする🐵

ActiveRecord::Relation#explainを使うと、実行するSQLのEXPLAINの結果を取得出来ます。ActiveRecord::Relation#explainではデフォルト設定でしか結果を取得出来なのですが、EXPLAINにはオプションが設定できます。 特にMySQLではオプティマイザが評価したSQ…

RubyonRails: ActiveJobのperform_laterが実行されてadapterがenqueueするまでの挙動を追ってみた。

最近Sidekiqを扱うことが割とあり、ActiveJob経由で使ったときの挙動をいまいち把握出来てなかったのでコードを読んでみて、内容とかをざっくりメモしておきます ちなみに読んだのはrailsの6-stableブランチのコードです。 rails/activejob at 6-0-stable · …

RailsでIDの可逆難読化する方法のメモ📝

最近、IDの可逆な方式で難読化したいけどfriendly_idみたいなmigrationが伴うものは、ちょっと避けたかったので色々と方法を考えたり人に教えてもらったりしたので、いろいろ方法とかをメモしておきます。 github.com やりたいこと ActiveRecordでUUIDを使う…

CommitteeでOpenAPIによるAPI定義ドキュメントをもとにリクエスト/レスポンス形式をチェックする

最近、Nuxt.jsとRailsでSPAのアプリケーションを作っていて、schema管理をOpenAPIで行ってみているのですが、 せっかくなのでCommitteeを使ってCIで検証するようしてみたので導入方法とかをメモしておきます Committeeとは? Committeeの使い方 Committeeを…

rails 6の新機能`insert_all`を試してみたのでMEMO📝

railsでbulk insertするときには今まではactiverecord-importが使うことが多かったと思いますが、 rails 6からはActiveRecord::Persistence#insert_allが追加されたので標準機能を使ってbulk insertを行うことができるようになりました。 github.com 実際に…

DockerでNuxt.jsとRailsの環境を作った

昨今、フロントとバックエンドを別々のリポジトリにしてOpenApiでインターフェースを定義して進むプロジェクトが増えてきていると感じていますが、OpenApiとか全然付いていけてないので個人でNuxt.jsとRuby on Railsが別々のコンテナで立ち上がる環境を作っ…

Railsで確認画面を挟んで登録する場合どう実装するのがよさそうか考えてみた

はじめに Railsで確認画面を実装すると毎回、ベストプラクティス的な解決方法が見つからず悩むので、どういう実装をするのが良いのか少し感がてみました。(私の個人的な見解です‍♂️) はじめに 確認画面の難しさ よく見るやり方 その他のやり方を検討してみる…

Rspec、Capybaraを使ったfeature specでJavaScript側でも指定した時間で固定できるHelperを作った

今回はタイトルどおり、Rspec、Capybaraを使ったfeature specでJavaScript側の時間を操作するhelperを作ってみたので考慮漏れとかあるかもですが書きます。 ↓コードだけみたい人はこちら rspecを使ったfeature specでjavascriptの時間を指定時間に固定するhe…

ブラウザの離脱イベント時にリクエストを投げるときにはsendBeaconを使ったほうが良いという話

最近、下記のようなページの離脱時のイベントを補足してサーバーにリクエストを投げるような処理を実装したのですが、 import axios from axios; window.addEventListener('beforeunload', () => { axios.post('/logs', { event: 'beforeunload' }); }) ペー…