diff --git a/datasette/templates/debug_actions.html b/datasette/templates/debug_actions.html
index 6dd5ac0e..0ef7b329 100644
--- a/datasette/templates/debug_actions.html
+++ b/datasette/templates/debug_actions.html
@@ -31,7 +31,7 @@
{{ action.name }} |
{% if action.abbr %}{{ action.abbr }}{% endif %} |
{{ action.description or "" }} |
- {{ action.resource_class }} |
+ {% if action.resource_class %}{{ action.resource_class }}{% endif %} |
{% if action.takes_parent %}✓{% endif %} |
{% if action.takes_child %}✓{% endif %} |
{% if action.also_requires %}{{ action.also_requires }}{% endif %} |
diff --git a/tests/test_html.py b/tests/test_html.py
index 35b839ec..7b667301 100644
--- a/tests/test_html.py
+++ b/tests/test_html.py
@@ -1194,6 +1194,21 @@ async def test_actions_page(ds_client):
ds_client.ds.root_enabled = original_root_enabled
+@pytest.mark.asyncio
+async def test_actions_page_does_not_display_none_string(ds_client):
+ """Ensure the Resource column doesn't display the string 'None' for null values."""
+ # https://github.com/simonw/datasette/issues/2599
+ original_root_enabled = ds_client.ds.root_enabled
+ try:
+ ds_client.ds.root_enabled = True
+ cookies = {"ds_actor": ds_client.actor_cookie({"id": "root"})}
+ response = await ds_client.get("/-/actions", cookies=cookies)
+ assert response.status_code == 200
+ assert "None" not in response.text
+ finally:
+ ds_client.ds.root_enabled = original_root_enabled
+
+
@pytest.mark.asyncio
async def test_permission_debug_tabs_with_query_string(ds_client):
"""Test that navigation tabs persist query strings across Check, Allowed, and Rules pages"""