先日のwatnowのハッカソンでアプリを開発をした際にRails 7.0.3を利用して開発しました。
ハッカソンで作ったアプリでログイン機能をrails7かつdeviceで実装するという選択をしたところハッカソンにおいて貴重な2時間を失ってしまいました。その際に得た知識が誰かの役にたてばなと思い記事にさせていただきました。
環境
Rails 7.0.3
Ruby 3.1.2
状況
Rails 7でdeviceでアカウント登録する際に独自に追加したカラムが保存されないという状況にハマりました。form_withを使用して実装しており、deviceが用意してくれているemailやnameといったカラムは保存されます。
エラー内容
deviceを使用してuserをcreateすると以下のようなエラーが出ました。
Started POST "/users" for ::1 at 2022-08-07 16:52:12 +0900
Processing by Devise::RegistrationsController#create as TURBO_STREAM
Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"name"=>"ノスケ", "email"=>"aaaa@email.jp", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "faculty"=>"1"}, "commit"=>"Sign up"}
TRANSACTION (0.0ms) begin transaction
User Exists? (0.2ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "nosuke@aaa.jp"], ["LIMIT", 1]]
TRANSACTION (0.0ms) rollback transaction
Rendering layout layouts/application.html.erb
解決方法
deviceのコントローラー周りを見たりdbを見たり色々していたのですが解決せず
原因がRailsのバージョン7のせいで起こっているのではないかと思いました。
deviceのissueを見てみると
とのこと。
Rails7からturboがdefaultで導入されたみたいなのですが、deviceがturboに対応しておらずリクエストを送るときにturbo: false
にしないといけないとのことでした。
感想
開発記事が調べにくい最新のバージョンにgemを利用することはハッカソンにおいてアンチパターンなのかもしれないと思いました。短期的な開発スピードが必要なことは明らかでRails7を使用することにためらいはありましたが、結果的に悪感的中。Herokuにデプロイする際もRailsのバージョンが関係しておりつまづいてしまったので次回のハッカソンの時には気をつけたいと思いました。しかしそういうことも含めてハッカソン楽しかったです。
参考記事