【发布时间】:2016-07-16 18:02:05
【问题描述】:
我正在使用 jbuilder 构建一个 json 响应。见下文,我的 jbuilder 模板:
json.array! @items do |item|
json.title item.title
json.description item.description
json.category item.categories.first.title
json.price item.price / 100.0
json.status item.status
if !item.banned?
json.published_date item.published_date
json.seller_name item.seller.name
end
json.seller_latitude item.seller.latitude.to_f
json.seller_longtitude item.seller.longtitude.to_f
end
我可以像这样从 item.categories 集合中访问一个对象,没有任何问题:
item.categories.first
当我尝试从上面返回的类别对象中提取标题属性时,我在浏览器中收到此错误:
undefined method 'title' for nil:NilClass
我在我的 jbuilder 模板中的这一行之前放了一个 byebug 语句:
item.categories.first.title
在 byebug 控制台中,我可以访问 title 属性没问题。请参阅下面的 byebug 控制台打印输出:
Started GET "/items.json" for ::1 at 2016-07-16 13:59:45 -0400
Processing by ItemsController#index as JSON
Item Load (0.5ms) SELECT "items".* FROM "items"
[1, 10] in /Users/Macbook/projects/VSC/app/views/items/index.json.jbuilder
1:
2: json.array! @items do |item|
3: json.title item.title
4: json.description item.description
5: byebug
=> 6: json.category item.categories.first.title
7: json.price item.price / 100.0
8: json.status item.status
9:
10: if !item.banned?
(byebug) item.categories.first.title
Category Load (0.3ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 1]]
"movies"
(byebug)
我被难住了,我做错了什么?
编辑:
这里是jbuilder渲染视图时触发的sql:
Started GET "/items.json" for ::1 at 2016-07-16 14:24:29 -0400
Processing by ItemsController#index as JSON
Item Load (0.8ms) SELECT "items".* FROM "items"
Category Load (0.5ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 1]]
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.5ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 2]]
CACHE (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.4ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 3]]
CACHE (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.5ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 4]]
CACHE (3.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.5ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 5]]
CACHE (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.4ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 6]]
CACHE (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.5ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 7]]
CACHE (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.4ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 8]]
CACHE (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.5ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 9]]
CACHE (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.4ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 10]]
CACHE (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Category Load (0.4ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."item_id" = $1 ORDER BY "categories"."id" ASC LIMIT 1 [["item_id", 11]]
Rendered items/index.json.jbuilder (317.5ms)
Completed 500 Internal Server Error in 329ms (ActiveRecord: 11.6ms)
ActionView::Template::Error (undefined method `title' for nil:NilClass):
2: json.array! @items do |item|
3: json.title item.title
4: json.description item.description
5: json.category item.categories.first.title
6: json.price item.price / 100.0
7: json.status item.status
8:
app/views/items/index.json.jbuilder:5:in `block in _app_views_items_index_json_jbuilder___331360250519835275_70269069934300'
app/views/items/index.json.jbuilder:2:in `_app_views_items_index_json_jbuilder___331360250519835275_70269069934300'
【问题讨论】:
-
好的,你能检查一下Jbuilder渲染视图时它触发的SQL吗?该 SQL 将是一个很好的调试起点
-
我贴出jbuilder渲染视图时触发的SQL,请看
-
好的,好的。我现在可以看到 ID 为 1 到 11 的项目有 categories。 id 11 之后的下一项是破坏代码。现在,打开
rails console和具有id的项目可能为12,我确信它没有与之关联的类别。这就是问题所在。因此,您需要进行一些过滤以仅选择具有类别的项目。 -
解决了!谢谢@ArupRakshit
标签: ruby-on-rails json jbuilder