はじめに
RailsアプリケーションでActiveAdminを使用している際に、次のようなエラーに遭遇することがあります。
NoMethodError at /admin/columns/new
undefined method `keys' for #<ActiveModel::Errors []>
この記事では、このエラーの原因と解決方法について説明します。
エラー内容の詳細
このエラーは、app/admin/column.rb
ファイル内でフォーム定義を行う際に発生します。具体的には、以下のコードが原因です。
f.semantic_errors *f.object.errors.keys
f.object.errors
がActiveModel::Errors
のインスタンスであるにもかかわらず、その中でkeys
メソッドが利用できないという問題が発生します。
エラーの原因
ActiveModel::Errorsの変更点
- Rails 6以前では、
ActiveModel::Errors
はハッシュのように扱うことができ、エラーが発生した属性名を取得するkeys
メソッドが利用できました。 - Rails 6.1以降では、
ActiveModel::Errors
はハッシュのようなインターフェースを持たなくなり、keys
メソッドが削除されました。その代わりに、attribute_names
やmessages
メソッドを使用する必要があります。
解決方法
Rails 6.1以降のバージョンを使用している場合、以下のようにコードを修正します。
修正前のコード
f.semantic_errors *f.object.errors.keys
修正後のコード
f.semantic_errors *f.object.errors.attribute_names
attribute_names
メソッドは、エラーが発生している属性の名前を配列として返してくれるので、以前のkeys
メソッドと同様の用途に使用できます。
解決手順
-
app/admin/column.rb
ファイルを開き、該当部分のコードを修正します。 - 修正した後、Railsサーバーを再起動します。
-
/admin/columns/new
のページにアクセスして、フォームが正常に動作するかを確認します。
まとめ
Rails 6.1以降では、ActiveModel::Errors
の変更により、以前使用していたkeys
メソッドが利用できなくなりました。そのため、attribute_names
を使用することで、問題を解決できます。
この修正を行うことで、NoMethodError
を解消し、フォームのエラーメッセージが正しく表示されるようになります。同じエラーで困っている方の参考になれば幸いです。
参考リンク
最後に
この記事が役に立ったら、ぜひ「いいね」や「ストック」をお願いします。また、他にもご質問があればコメントでお知らせください!