1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails undefined method 'keys' for #<ActiveModel::Errors []>

Posted at

はじめに

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.errorsActiveModel::Errorsのインスタンスであるにもかかわらず、その中でkeysメソッドが利用できないという問題が発生します。

エラーの原因

ActiveModel::Errorsの変更点

  • Rails 6以前では、ActiveModel::Errorsはハッシュのように扱うことができ、エラーが発生した属性名を取得するkeysメソッドが利用できました。
  • Rails 6.1以降では、ActiveModel::Errorsはハッシュのようなインターフェースを持たなくなり、keysメソッドが削除されました。その代わりに、attribute_namesmessagesメソッドを使用する必要があります。

解決方法

Rails 6.1以降のバージョンを使用している場合、以下のようにコードを修正します。

修正前のコード

f.semantic_errors *f.object.errors.keys

修正後のコード

f.semantic_errors *f.object.errors.attribute_names

attribute_namesメソッドは、エラーが発生している属性の名前を配列として返してくれるので、以前のkeysメソッドと同様の用途に使用できます。

解決手順

  1. app/admin/column.rbファイルを開き、該当部分のコードを修正します。
  2. 修正した後、Railsサーバーを再起動します。
  3. /admin/columns/newのページにアクセスして、フォームが正常に動作するかを確認します。

まとめ

Rails 6.1以降では、ActiveModel::Errorsの変更により、以前使用していたkeysメソッドが利用できなくなりました。そのため、attribute_namesを使用することで、問題を解決できます。

この修正を行うことで、NoMethodErrorを解消し、フォームのエラーメッセージが正しく表示されるようになります。同じエラーで困っている方の参考になれば幸いです。

参考リンク

最後に

この記事が役に立ったら、ぜひ「いいね」や「ストック」をお願いします。また、他にもご質問があればコメントでお知らせください!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?