はじめに
Railsで管理画面を実装している際に、以下のようなエラーに遭遇することがあります。
NoMethodError at /admin/items
undefined method `delete' for :ok:Symbol
この記事では、このエラーの原因とその解決方法について詳しく解説します。
エラーメッセージの詳細
エラーが発生するのは、app/admin/item.rb
ファイルの以下の部分です。
column :name
column "ステータス" do |item|
if item.is_active
status_tag "アクティブ", :ok
else
status_tag "非アクティブ"
end
end
このコードでstatus_tag
に渡している:ok
が原因で、エラーが発生しています。
エラーの原因
status_tag
の仕様
-
status_tag
メソッドの第2引数には、class
オプションを含む文字列またはハッシュを渡す必要があります。 -
:ok
というシンボルがそのまま渡されると、status_tag
メソッドはそのシンボルを扱いきれず、undefined method 'delete' for :ok:Symbol
というエラーを引き起こします。
:ok
シンボルの誤用
:ok
をシンボルとして渡してしまっているため、status_tag
メソッドが期待する形になっていません。その結果、メソッド内部でオプションを扱おうとした際にエラーが発生しています。
解決方法
エラーを解消するには、status_tag
の第2引数を文字列またはクラスオプションを指定したハッシュに変更します。
修正前のコード
column :name
column "ステータス" do |item|
if item.is_active
status_tag "アクティブ", :ok
else
status_tag "非アクティブ"
end
end
修正後のコード
以下のように、:ok
をclass: "ok"
に変更します。
column :name
column "ステータス" do |item|
if item.is_active
status_tag "アクティブ", class: "ok"
else
status_tag "非アクティブ"
end
end
修正ポイント
-
status_tag "アクティブ", :ok
をstatus_tag "アクティブ", class: "ok"
に変更しました。 - これにより、
:ok
シンボルを直接渡すのではなく、HTMLクラス名としてclass: "ok"
を指定する形になります。
実装後の確認
- 修正を
app/admin/item.rb
に反映させます。 - Railsサーバーを再起動します。
-
/admin/items
ページにアクセスして、ステータスが正しく表示されるかを確認します。
まとめ
Rails 6.1以降の変更や管理画面のカスタマイズに伴い、status_tag
のオプション指定方法に誤りがあると、NoMethodError
が発生することがあります。このエラーは、シンボルをクラス名として渡す際に文字列に変更することで解消できます。
ポイント
-
status_tag
のオプションにはハッシュを使用して、class
やその他の属性を指定することが重要です。 - これにより、
NoMethodError
を解消し、ステータス表示のカスタマイズが正しく行えるようになります。
この記事が同様の問題で困っている方の助けになれば幸いです。参考になった方はぜひ「いいね」や「ストック」をお願いします。
参考リンク
最後に
他にもご質問やご意見があれば、コメントでお気軽にお知らせください!