当我
render json: {
error: "No such user; check the submitted email address",
status: 400
}
Run Code Online (Sandbox Code Playgroud)
然后做我的测试并检查
response.code
Run Code Online (Sandbox Code Playgroud)
我得到200而不是400
我肯定这个荒谬简单的答案,但我一直在寻找一个小时,似乎无法让这个工作.我可以解析Json,然后检查状态代码......但是有没有办法让response.code返回状态?我理解技术上它是成功的,我认为这就是为什么response.code返回200,但我之前使用的是Jbuilder,直接影响返回的代码.
我已经开始了Rails 4
.
在处理JSON格式数据时,我发现我们可以使用rails/jbuilder
并且运行良好.
但是,当我拿着Codeschool的Rails 4 Pattern时,他们提到了gem active_model_serializers
.
对于active_model_serializers
gem而言,所有JSON
序列化逻辑都会进入Model(被认为是最佳实践).
而对于jbuilder
gem,我们需要编写带扩展名的单独视图文件.json.jbuilder
.
我的问题是:
ruby ruby-on-rails jbuilder active-model-serializers ruby-on-rails-4
当使用DHH的JBuilder测试来自RSPEC控制器测试的JSON响应时,我的response.body总是"{}".它在开发/生产模式下工作正常.当我使用to_json方法而不是jbuilder时,我在response.body中获得了正确的JSON.
任何人都有一个线索,为什么我的response.body在测试时总是"{}"?
-----调试器
它"应该通过JSON返回购物车项目",:焦点做
get:index,:format =>:json
end
(rdb:1)response.body
"{}"
当我尝试获取所有类别(索引操作)时出现错误:
undefined local variable or method `json'
Run Code Online (Sandbox Code Playgroud)
但在展示行动一切都很好.所有文件都有.jbuilder扩展名.这是控制器代码:
def index
@categories = Category.all
end
# GET /categories/1
# GET /categories/1.json
def show
@category = Category.find(params[:id])
end
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
app/views/categories/index.json.builder:1:在
_app_views_categories_index_json_builder___502133872307116590_70140532925300' actionpack (3.2.11) lib/action_view/template.rb:145:in
渲染块'
activesupport(3.2.11)lib/active_support/notifications.rb:125:in render'中instrument'
actionpack (3.2.11) lib/action_view/template.rb:143:in
在jbuilder.json模板中一直编写这样的代码是一件痛苦的事:
json.extract! notification, :id, :user_id, :notice_type, :message, :resource_type, :resource_id, :unread, :created_at, :updated_at
Run Code Online (Sandbox Code Playgroud)
所以我想像这样编码;
json.extract_all! notification
Run Code Online (Sandbox Code Playgroud)
我发现我可以像下面的代码那样做,但它们对我来说仍然有点冗长.
notification.attributes.each do |key, value|
json.set!(key, value)
end
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法?
我有一个控制器,它返回一个ActiveRecord对象数组和一个jbuilder视图来生成json(所有标准的东西).如果我想要一个哈希数组,那么效果很好.
所以例如我有:
json.array!(@list) do |l|
json.( l, :field )
end
Run Code Online (Sandbox Code Playgroud)
返回
[
{ "field": "one" },
{ "field": "two" },
{ "field": "three" }
]
Run Code Online (Sandbox Code Playgroud)
但是,我只想要一个字符串数组; 这样我的json就是
[
"one",
"two",
"three"
]
Run Code Online (Sandbox Code Playgroud)
我的jbuilder文件应该是什么?
我正在使用JBuilder来返回一些JSON.我有一个index.json.jbuilder
生成数据,我需要将其渲染为字符串.但是,我不知道如何做到这一点,因为:@my_object.to_json
并且@my_object.as_json
似乎没有通过JBuilder.
我怎么能将JBuilder视图渲染为字符串?
我用JBuilder创建了一个json视图.但我想将其预加载到数据对象中,因此Backbone可以在不提取数据的情况下尽早访问数据.
如何将list.json.jbuilder视图呈现到list.html.erb视图中?
通常没有jbuilder,我会做这样的事情:
<div data-list="<%= @contents.to_json %>"></div>
Run Code Online (Sandbox Code Playgroud) 我需要循环产生哈希,而不是对象数组.我有这个:
json.service_issues @service.issues do |issue|
json.set! issue.id, issue.name
end
Run Code Online (Sandbox Code Playgroud)
结果:
service_issues: [
{
3: "Not delivered"
},
{
6: "Broken item"
},
{
1: "Bad color"
},
{
41: "Delivery problem"
}
]
Run Code Online (Sandbox Code Playgroud)
我需要这个:
service_issues: {
3: "Not delivered",
6: "Broken item",
1: "Bad color",
41: "Delivery problem"
}
Run Code Online (Sandbox Code Playgroud)
是否可以在不将AR结果手动转换为哈希的情况下执行此操作?
我正在尝试构建一个JSON文件,以通过变体代码访问产品的变体.理想情况下,我可以调用variations.abcdefgh,基本上要求定义这样的结构:
{
"variations":{
"abcdefgh":{
"available":true,
"price":"12.00"
},
"ijklmnop":{
"available":false,
"price":"25.00"
}
}
}
Run Code Online (Sandbox Code Playgroud)
在products/show.json.jbuilder中做一些事情
json.variations @product.variations
Run Code Online (Sandbox Code Playgroud)
给我格式化如下:
{
"variations":[
{
"available":true,
"price":"12.00",
"product_code":"abcdefgh"
},
{
"available":true,
"price":"25.00",
"product_code":"ijklmnop"
}
]
}
Run Code Online (Sandbox Code Playgroud)
也许我的JavaScript可能会更好,但我想要一些基于product_code更容易访问的东西.我得到的最接近的是
@product.variations.each do |variation|
json.set! variation.product_code, variation
end
Run Code Online (Sandbox Code Playgroud)
但我还没有找到一个解决方案,将这些正确格式化的对象作为子项放入变体属性中.有没有人遇到过类似的事情?