patorashのブログ

方向性はまだない

Ruby

VagrantでポートフォワードしながらActiveStorageのファイルを表示する

今月初頭に社内ISUCONを開いたという記事を書きました。 patorash.hatenablog.com その環境を仮想環境で構築してローカルでも試せるようにとVagrantを使って準備したのですが、自分がそれを使っていてハマッたのでメモ。 Vagrant上では、nginxを経由して表示…

system spec実行時に事前にwebpacker:compileさせる

これは、以下の記事を参考にしていたときの副産物ですが、ちょいちょいハマったところがあるので記事にしておきます。 techracho.bpsinc.jp ローカルでついうっかりsystem specを行うと、初回アクセス時にwebpacker:compileが実行され、最初のテストがほぼ、…

exists?で起きるN+1問題に対処するためにSetを使った話

課題:データを弾くためにN+1問題が発生していた 数年前に実装した、CSVデータをDBにインポートするためのプログラムがありました。 単にインポートするだけならいいのですが、除外リストに登録済のデータは弾いてほしい、という要望があり、そのように実装…

GraphQLの検索先をActiveRecordからElasticsearchに変更する

この記事はQiitaにも書いていますが、一応ブログにも同様のものを載せておきます。 qiita.com graphql-rubyはリソースの参照元のデフォルトがActiveRecordなので、それをElasticsearchに変更したかったのですが、ライブラリがなかったので自分で実装しました…

Selenium WebDriverからCupriteへの移行は難しい件

この記事を読んで、SeleniumからCupriteに移行できたらテストがまた速くなるんじゃないか?と思ってここ数日動作検証してるのですが、思った以上にうまくいかないので、一旦移行を諦めようかなという気持ちになっています。 techracho.bpsinc.jp とはいえ、…

gem auditedでrails consoleやrake taskの時にデフォルトユーザーを設定する

auditedというgemを使って、監査ログを保存するようにしたいと思い、現在調査中。 github.com 大体はよさそうなので、採用したいと思っているのだけれど、困ったのが、rails consoleとかでデータ変更されたとき。データ変更の履歴は残るものの、誰がやったか…

SQLiteのLIKE演算子はデフォルトでESCAPE文字が設定されていない

私はimyouというニックネーム管理用gemを公開しているのですが、開発時にPostgreSQLを使っていました。 しかし、RailsのデフォルトのデータベースはSQLiteなので、SQLiteで開発したほうがよかろうと考え、SQLiteに変更してテストを実行したところ、なんと落…

Rubyで要素数が異なる二次元配列で行と列を入れ替える

最近のPRのレビューをしているときに、二次元配列のデータを入れ替える処理をしているところがあったので、レビュー後にチャットで意見交換していたら綺麗な感じにできたのでそれをメモして残しておく。 transposeを使うのがミソなのだけれど、transposeを使…

RSpecでモデルのエラー確認はof_kind?が便利

Rails 6からだけれど、モデルのエラー確認にof_kind?メソッドが使えるらしい。 最初は、伊藤さんのQiitaの記事を見て、be_addedメソッドを知った。これも便利そうだなぁと思っていたのだが、そのコメント欄にRails 6からof_kind?が加わったと書いてあった。 …

AWS SDK for Rubyでminio上のバケットを削除するときのTips

自分のための備忘録です。 seed-fuを使ってデータ投入していたのだが、データを作り直そうと思ってseed-fuを再び実行したところ、minioのバケットを作るところでコケた。原因は、既にバケットがあったからだった。 require 'aws-sdk-s3' storage_yml = YAML.…

stimulus 2.0.0の進化が凄い件(サンプルコードあり)

仕事で、とあるRailsアプリを作っているのですが、そこでstimulusを採用していました。そうしたらちょうど少し前にstimulusのバージョン2.0.0がリリースされていました。このバージョンアップによって、かなり書きやすくなりました。 今までと何が違うのか?…

simple_formを使ってActiveStorageのダイレクトアップロードを行う

引き続き、ActiveStorageネタです。 simple_formを使ってActiveStorageのdirect_uploadの設定を書くと、うまくいきません…。 = simple_form_for(@post) do |f| / 略 .form-inputs / 動くけれどダイレクトアップロードにはならない… = f.input :images, as: :…

ActiveStorageで画像を追加アップロードする

さっきこんな記事を書きました。 patorash.hatenablog.com 今度は、更新で画像を追加しようとしたところ、上書きされてしまいました。 追加されると思っていたのでびっくりな挙動でしたが、その辺りはこのissueにあります。 github.com Rails5までは、追加が…

ActiveStorageで添付した画像をupdateで削除する

Rails 6.0でとあるアプリを作っているのですが、ActiveStorageを使って画像を添付しています。登録は比較的簡単に行えたのですが、画面から画像のみ削除する方法がいまいちわからなかったので調査しました。 コード(修正前) モデル 複数の画像が添付できる…

Rails6.0にアップグレードしたらActiveStorageでハマった件(追記あり)

最近は担当製品の関連アプリを改修しているのですが、Railsのバージョンを5.2系から6.0にアップグレードしました。そのときにActiveStorageでハマったので備忘録を残しておきます。なお、担当製品は既にRails6にしてあります。ただし、まだActiveStorage使っ…

RSpecによるRailsテスト入門を読んだ

RSpecの本はすごく前にThe RSpec Bookを読んでいたけれど、もうすでにだいぶ古いし、他の人に薦められるかってのと自分が知らないことが書いてあるかもってことで、Everyday Rails RSpecによるRailsテスト入門を買って読んでみた。 leanpub.com とはいえ、買…

has_manyの最新のデータをhas_oneで関連付けする方法

元ネタはこのQiitaの投稿。 qiita.com この投稿のように、UserモデルとArticleモデルが1対多になっていて、ユーザーに紐づいた最新の記事を取得したいこととかはあると思います。私がやってるプロジェクトでも似たようなことがありました。ユーザーに紐づい…

aws-sdk-s3を使いつつ、timecopで時間をずらす

ストレージを伴うテストのためにminioを使うようにしようとしたのですが、設定をしただけではうまく動きませんでした。 timecopを使っているところで、aws-sdkがエラーを起こしました。timecopは時間を固定したり過去・未来に移動したりするライブラリです。…

Rails 5.2.3から5.2.4.3に更新したらActiveStorageでエラー発生した

社内のRailsアプリのバージョンアップを行ってテストを実行したところ、システムテストが通らなくなりました。 ArgumentError: unexpected value at params[:whitelist_headers] というエラーが出たので、ググったところ、RailsにPRが…。 github.com これはR…

herokuでjemallocのbuildpackの新しいバージョンが出ていた

過去にこのような記事を書いていました。 patorash.hatenablog.com この記事を見返しながら、他のHerokuアプリケーションにもjemallocのbuildpackを適用しようと思ってたのですが、なんとなくbuildpackのページに移動したところ、メンテナンス停止になってい…

activerecord-importの削除は難しい

Rails6にしたので、insert_allメソッドが使えるようになったので、意気揚々とgem activerecord-importを削除しようと修正していってたのだけれど、思ったより難しそうだったので、一旦止めることにした。 activerecord-importの削除が難しい理由 recursiveオ…

PaperclipがImageMagickのデフォルト設定の影響で動かなくなったのを直した

昨日、Macのセットアップが終わったという話をしました。 patorash.hatenablog.com そして、Docker立ち上げて作業後にrspecを流したら、全然関係ないところがエラーで落ちるじゃないですか… pryで止めて、@model.errorsを出力してみると… @details={:report=…

7年開発しているプロジェクトをRails6にアップグレードした

Railsのアップグレード作業は検証含めて非常に面倒なもので、結構遅れがちなのですが、どこかで気合い入れてやらなければなーと思い、エイヤッとやってやりました。Rails3からやってるプロジェクトなので負債もまだまだ多いですが、とりあえずメジャーバージ…

gem doorkeeperの承認画面に遷移しない場合があった

gem doorkeeperで連携アプリケーションにログインをさせようとしたところ、認証後に権限の承認画面に遷移せずに普通に認証アプリケーションのログイン後の画面に遷移してしまいました。本来ならば、連携アプリケーションにログインしてほしいのに…。 原因 de…

GETメソッドのFormでの画面遷移をTurbolinksに委ねる

今作ってるアプリケーションではTurbolinksを効かせてて、かなりいい感じだな〜と思ってるのですが、一覧で検索した結果や表示件数を変更した場合に、ページの更新が発生してサクサク移動してたのに、ここでもたつくなぁ…と課題に感じていました。 なんとな…

WSL2 + DockerでRailsの変更を検知しないのを修正した。

表題の通りなのですが、ファイルの変更を行ってからブラウザをリロードしても変更が反映されませんでした。反映しなおすには、Railsサーバを再起動しなければならず、非常に面倒です。 調べたところ、Vagrantでの開発とかでも同様のことが起きたりしているぽ…

deviseで論理削除を実装するときの手順をまとめておく

新しいRailsアプリを作るたびにやっている気がするので、一旦まとめておこうと思います。 今回公開する手順は、削除済みのメールアドレスで再登録可能な論理削除の実装方法です。 Deviseとは? Deviseはアカウント認証管理のgemです。Webアプリケーションに…

gem buoysを使ってパンくずリストを作る

今ちょっと新しいRailsアプリを作っていて、そこでパンくずリストが欲しいなぁ〜と思ったので社内のチャットで「パンくずリストを作るためのgemのデファクトスタンダートってやっぱりgretelですか?」と聞いたところ、I18n対応できるbuoysというgemがあるの…

RailsでModelとDBの制約の検証をするときの方針について

弊社の若者のPRでコメントしたんだけれど、これは普通に記事にできるかなと思ったので転載する。 事の経緯 Modelでのバリデーション メリット デメリット データベースでのバリデーション(Unique制約, Not Null制約, Check制約等) メリット デメリット テ…

CircleCIでdocker-composeを起動してテストを実行

ようやく、CircleCIにてdocker-composeを使ってテストを流して問題なく終了するようになったので、そのためにやったことを書いておきます。 これまでの経緯は過去の記事を参照のこと。 patorash.hatenablog.com patorash.hatenablog.com patorash.hatenablog…