もふもふ技術部

IT技術系mofmofメディア

Rails

dockerのRuby環境をHerokuと同じUbuntuで動くものにする

Dockerの公式が出しているRubyのdocker imageではdebianやapline linuxが使用されています。mofmofではHerokuで本番環境を作っているアプリも多いのですが、HerokuではUbuntuが使われています。 そのため、ローカルで使用しているdockerでもUbuntuを使ってHe…

【Rails7】JS不要!Hotwireで無限スクロールを実装する

Hotwireを使ってみる第三弾です! 今回はJSを使わずに、Hotwireで無限スクロールを実装してみます。 下準備 Gemをインストールする gem "kaminari" モデルを作る $ rails g model post 20240813000000_posts.rb class CreatePosts < ActiveRecord::Migration…

【Rails7】Hotwireで検索を実装する

Hotwireを使ってみる第二弾です! 今回は、検索結果をHotwireで表示するようにしてみます。 画面の全てを再描画する必要がないので、速度が上がるかもしれませんね! 下準備 モデルを作る $ rails g model post 20240813000000_posts.rb class CreatePosts <…

【Rails7】JS不要!Hotwireで「もっと見る」を実装する

Rails6までは「もっと見る」などの動的な機能を実装する場合はJSが必須でした。 しかし、Rails7から標準搭載されたHotwire(Turbo)を使用すると、JSを使わずに「もっと見る」を実装することができます。 今回はHotwireを使った「もっと見る」の実装方法を紹…

【Rails】deviseを使わない自前のユーザー認証 -パスワードリセット編

deviseを使わない自前のユーザー認証 の続きで、今回はパスワードリセット機能を実装します。 下準備 カラムを追加します $ rails g migration add_password_reset_to_users 20240726000000_add_password_reset_to_users.rb class CreateUsers < ActiveRecor…

【Rails】deviseを使わない自前のユーザー認証

deviseを使ったユーザー認証はとても便利ですが、カスタマイズをしたいときや、APIモードで使う時には不便なことがあります。 そこで今回は、deviseを使わない自前のユーザー認証を実装します。 下準備 Gemfileに使用するGemを追加します (Gemfileの中でコ…

【Rails】validationのエラーメッセージをカラムごとに抜き出す

バリデーションでエラーになった際に、エラーメッセージを各テキストフィールド等の下部に表示したい時があると思います。 今回はそんな時に便利な各attributeごとにエラーメッセージを抜き出す方法を紹介します。 手順 例えば User の email のエラーは以下…

【Rails7】特定のviewsで部分的にReactを使う

「ここのページだけReact使いたいんだよな〜」とか「ページのここの部分にReact入れ込みたいんだよな〜」ということはありませんか? 今回はそんなあなたにReactを部分的に使用する方法を紹介します。 こちらの記事を応用していきます。↓ www.mof-mof.co.jp …

【Rails7】任意のviewsからJSファイルを個別に読み込む

このviewsだけにこのJSを読み込みたい・・・! という時があると思います。 今回はそんな時のためにJSファイルを個別に読み込む方法を紹介します。 (esbuildを使用している前提で進めていきます) 手順 package.json に記載されているビルドスクリプトのビ…

Rails7 に React + TypeScript を導入する

Rails7のアプリでJSのビルドツールはesbuildを使用します。 環境構築の方法はこちらを参照ください↓↓ www.mof-mof.co.jp ReactとTypeScriptをインストールする 以下のコマンドで必要なパッケージをインストール yarn add typescript react react-dom react-r…

よく使う・知ってると便利な rails new コマンドのオプション

Railsプロジェクトを新規作成する機会は多くないため意外とオプションって忘れがちだと思います。 rails new コマンドのオプションなんだったっけかな〜という時のために よく使うオプション、知ってると便利なオプションをまとめてみました。 DB編 使用する…

Rails7 に Tailwind CSS を導入する

Rails7以前で Tailwind CSS を使用したい場合はWebpackerを使って yarn add tailwindcss して ほげほげファイルを追加して〜〜としていたと思います。 Rails7からはWebpackerが標準ではなくなったので、導入方法が変わりました。 プロジェクト作成時に導入す…

Rails7 + MySQL を docker-compose で環境構築する

以前、Rails7 + PostgreSQLの環境構築をしました。 www.mof-mof.co.jp www.mof-mof.co.jp 今回は、MySQLを使ったRails7の環境構築をしてみます。 本記事ではビルドにimportmapを使用した場合の環境構築を行なっていきます。 esbuildを使用する場合は こちら…

Rails7 + PostgreSQL + esbuild を docker-compose で環境構築する

Rails7がリリースされてから、環境構築で躓いた経験がある方は少なくないのではないでしょうか。 今回は、Rails7 + PostgreSQL + esbuild の環境を docker-compose で構築していきたいと思います。 Rails7 + PostgreSQL + importmap の環境構築については以…

Rails7 + PostgreSQL + importmap を docker-compose で環境構築する

Rails7がリリースされてから、環境構築で躓いた経験がある方は少なくないのではないでしょうか。 今回は、Rails7 + PostgreSQL + importmap の環境を docker-compose で構築していきたいと思います。 Rails7 + PostgreSQL + esbuild の環境構築については以…

GraphQL RubyでバリデーションエラーをUnion Typeで返す

graphqlでエラーを返す方法はいくつかあり、それぞれメリデメありますが、Unionで返すのが好みです。 例えば、以下のようにmutationで実行時のバリデーションエラーを共通のフォーマットで返すことを考えてみました。 mutation createPost($input: CreatePos…

新規サービスを作るときに使う技術選定

mofmofでは新規サービスをゼロから開発することが多くあります。 その際にshwldがどのように技術選定をしているのかを書いてみます。 こちらの記事がとても参考になる内容で、私なりにも書いてみようと思いこの記事を書いています。 https://zenn.dev/moga/a…

ActionMailboxでRSpecのテストを書く

この記事の内容 ActionMailboxは、Railsアプリでメールを受け取ることができる機能です。 それを応用して、 Railsアプリにメールを送ることで投稿を作成することもできます。 先日ActionMailboxを利用した機能開発中、RSpecで ActionMailboxのテストを書くこ…

既存Railsアプリに後からReactとTypeScriptを導入する

react-rails gemを使う方法 react-rails gemを使わない方法 TypeScriptを導入する 今回は、弊社メンバーが研修時に実装した課題のアウトプットがちょうど良かったので、そこに後からReactとTypeScriptを導入していきます。 この課題は、万葉さんが公開してい…

【Rails】GraphQL爆速入門 サンプルアプリでgraphql-rubyのCRUDをちゃんと理解する

以前は純Railsで開発を行うことが多かったんですが、最近はgraphql-ruby + SPAを採用することも増えています。 フロントの表現力がやっぱり違いますね。最近はリッチな要望をいただくことも多く、うまいこと対応するには都合が良いです。あと作ってて楽しい…

RailsアプリケーションとKintoneを連携する

CMS(顧客管理システム)で一番有名なのはセールスフォースですが、国内製品だとサイボウズが提供する Kintone が有名です。 操作性もよく、個人的にはセールスフォースよりずっと使いやすいんじゃないかと思ってます。 今回は、業務で Rails アプリケーショ…

Payjpを導入したアプリのテストを書いていく

前回の記事ではPayjpを使った定期購入の実装について解説した。そこで今回は、Payjpを使った実装のテストについて書いてみたいと思う。 Payjpは外部APIなので、API呼び出し部分のモックを作ってテストを記述した方が良い。 対象となるアプリ 2つ前の記事で作…

Pay.jpで定期課金を実行する

前回の記事でPayjpを用いた単発決済の実装方法を解説した。 そこで今回は、Payjpで定期課金機能を実装してみたいと思う。 想定 有料会員登録としてカード登録をしないと、主要なサービスが使えないWebアプリを想定する。 以下のような仕様であるとする。 定…

Pay.jpで単発決済機能を実装する

Railsで決済機能を実装する際、決済サービスの候補としてあがるのはだいたいStripeかPay.jpだと思う。 業務で定期講読する商品を扱うことになりPay.jpを使って実装を行なったが、Payjpの定期購入について解説した記事が少なかったので解説してみたいと思う。…

Railsでモデル層からバリデーションを切り出して共通のバリデーションルールを定義する ActiveModel::Validator編

前回の記事では1つの属性に関するバリデーションルールを共通化出来るActiveModel::EachValidatorについて解説した。 そこで今回は、Railsのバリデーションを定義するためのもう一つの基底クラスである、ActiveModel::Validatorについて解説したいと思う。 A…

Railsでモデル層からバリデーションを切り出して共通のバリデーションルールを定義する ActiveModel::EachValidator編

アプリケーションを開発していると、電話番号やURL、カナなど複数のモデルで同じバリデーションを定義していることがある。 上記の例くらいなら、同じバリデーションルールを複数箇所で書いても良さそうだが、変更が生じた時やもう少し複雑なバリデーション…

create済みのモデルのIDをUUIDに変更してみた

Railsアプリへのuuidの適用方法 postgresqlのuuid拡張機能を有効化 initializers内でprimary keyのデフォルト値をuuid化 バージョン スキーマ users events event_participants マイグレーション まとめ Railsアプリへのuuidの適用方法 Railsアプリへのuuid…

Sidekiq実行したらエラーになったので調査して修正したこと

エラー sidkiqで実行した処理 設定確認 ログ確認 推測 対策 参考 エラー Railsでsidekiq使ってるときに以下のエラーが出ました。 could not obtain a database connection within 5.000 seconds これは、使用可能なコネクション数よりも多くの接続を使用しよ…

RailsプロジェクトでSlack通知を実装する

プロジェクトの開発中・リリース直後は想定外のエラーが多発するため、異常はすぐに検知出来た方が開発スピードが上がりますね。 今回はそういったケースでライトにSlackへの通知が出来る、slack-notifierのご紹介です。 gemインストール Gemfileにslack-not…

seed-fuを使って開発・テスト・本番それぞれの環境でのシードデータを作成する

Railsではrails db:seedという便利なコマンドがあり、db/seed.rbにシードデータを入れておけばコマンドを叩いたら勝手にシードデータを作成してくれます。 ただ、1度だけ使うシードデータを作成する場合はいいですが、例えばシードデータを編集して再度実行…