はじめに
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を解消し、ステータス表示のカスタマイズが正しく行えるようになります。
この記事が同様の問題で困っている方の助けになれば幸いです。参考になった方はぜひ「いいね」や「ストック」をお願いします。
参考リンク
最後に
他にもご質問やご意見があれば、コメントでお気軽にお知らせください!