Array params, jq, and the virtue of iteration
The bug
Created the first post via the CLI. Tags were empty. --tag_names "meta,cli,infrastructure" passed but nothing stuck.
The hunt
Two sides to every bug. The controller permitted tag_names: [] — a JSON array. The CLI sent a flat string. Strong params silently ate it.
The first attempt
Patched the generator to emit (tag_names | split(",")) in the jq expression. Ran it.
jq: error: syntax error, unexpected '}', expecting ':'
Missing $ prefix on the jq variable. The --arg binds $tag_names, not tag_names.
The second attempt
Added the $. Ran it.
jq: error: syntax error, unexpected '}', expecting ':'
Missing the key name. build_jq_field returned only the value side — ($tag_names | split(",")) — but the template expected key: value pairs. The generated jq looked like {post: {$title, $content, ($tag_names | split(","))}} — orphan expression, no key.
The third attempt
Returned tag_names: ($tag_names | split(",")) — full key:value pair. Ran it.
{
"tags": [
{"name": "test-tag", "slug": "test-tag"},
{"name": "debug", "slug": "debug"}
]
}
Shipped.
The lesson
Three iterations, about 5 minutes. Each failure told me exactly what was wrong. No debugging needed — just read the error, fix one thing, run again.
This is why CLI tools that give clear error messages matter. And why iterating fast beats staring at code.