我有User和Item模特.我想构建一个如下所示的JSON响应:
{
"user":
{"username":"Bob!","foo":"whatever","bar":"hello!"},
"items": [
{"id":1, "name":"one", "zim":"planet", "gir":"earth"},
{"id":2, "name":"two", "zim":"planet", "gir":"mars"}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,我User和Item模型有更多的属性而不仅仅是那些.我找到了一种方法让它工作,但要注意,它不漂亮......请帮助......
下一节包含原始问题.最后一节显示了新的解决方案.
class HomeController < ApplicationController
def observe
respond_to do |format|
format.js { render :json => Observation.new(current_user, @items).to_json }
end
end
end
Run Code Online (Sandbox Code Playgroud)
# NOTE: this is not a subclass of ActiveRecord::Base
# this class just serves as a container to aggregate all "observable" objects
class Observation
attr_accessor :user, :items …Run Code Online (Sandbox Code Playgroud) 我对ruby和尝试一些基本的东西都很新.当我使用以下命令向服务器发送HTTP请求时:
curl -v -H "Content-Type: application/json" -X GET -d "{"myrequest":"myTest","reqid":"44","data":{"name":"test"}}" localhost:8099
Run Code Online (Sandbox Code Playgroud)
我的服务器将JSON数据视为"{myrequest:myTest,reqid:44,data:{name:test}}"
但是当我使用以下ruby代码发送请求时:
require 'net/http'
@host = 'localhost'
@port = '8099'
@path = "/posts"
@body = ActiveSupport::JSON.encode({
:bbrequest => "BBTest",
:reqid => "44",
:data =>
{
:name => "test"
}
})
request = Net::HTTP::Post.new(@path, initheader = {'Content-Type' =>'application/json'})
request.body = @body
response = Net::HTTP.new(@host, @port).start {|http| http.request(request) }
puts "Response #{response.code} #{response.message}: #{response.body}"
Run Code Online (Sandbox Code Playgroud)
它将其视为"{\"bbrequest \":\"BBTest \",\"reqid \":\"44 \",\"data \":{\"name \":\"test \"}} "并且服务器无法解析它.也许我需要设置一些额外的选项来从Ruby发送请求以排除那些额外的字符?
你能帮忙吗?提前致谢.
我想将一个Place对象数组转换为json,我一直这样做:
var places = <%= @places.to_json.html_safe %>;
Run Code Online (Sandbox Code Playgroud)
唯一的问题是@places数组中的每个位置都有一个未包含的关联标记列表.我正在使用acts_as_taggable_on gem来处理标签,所以要获取一个地方的标签列表,我需要说place.tag_list.
我需要做些什么来为javascript数组中的每个位置包含tag_list?我想我需要编写自己的to_json方法,但我不知道如何.
编辑
事实证明,这比我意识到的要容易.我能够这样说:
var places = <%= @places.to_json(:include => :tags).html_safe %>
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,这包含有关每个标签的更多信息,而不是我真正需要的.每个标签都有一个id和名称,我真正想要的只是一个带有标签名称的列表.
可能重复:
在Rails 2.3.5中覆盖to_json
LIB/responses.rb
module Responses
class Response
def to_json
JSON.pretty_generate(self)
end
end
class ErrorResponse < Response
def initialize(cause)
self[:type]="Error"
self[:casue]=cause
end
end
class DataResponse < Response
attr_accessor :data
end
end
Run Code Online (Sandbox Code Playgroud)
这由控制器使用:
response=Responses::DataResponse.new
response.data=someData
render :json => response
Run Code Online (Sandbox Code Playgroud)
现在,我得到一个错误wrong number of arguments (1 for 0)在lib/responses.rb:3:in to_json.为什么?没有参数传递给to_json隐式调用的render :json.那我的错误在哪里?
首先,我没有使用Rails.我正在使用Sinatra进行Active Record的这个项目.
我希望能够在我的Model类上覆盖to_json或as_json,并让它定义一些'default'选项.例如,我有以下内容:
class Vendor < ActiveRecord::Base
def to_json(options = {})
if options.empty?
super :only => [:id, :name]
else
super options
end
end
end
Run Code Online (Sandbox Code Playgroud)
其中Vendor具有的属性多于id和name.在我的路线中,我有以下内容:
@vendors = Vendor.where({})
@vendors.to_json
Run Code Online (Sandbox Code Playgroud)
这@vendors是一个Array供应商对象(显然).但是,返回的json不会调用我的to_json方法并返回所有模型属性.
我实际上没有选择修改路线,因为我实际上使用的是修改过的sinatra-rest gem(http://github.com/mikeycgto/sinatra-rest).
有关如何实现此功能的任何想法?我可以在我的sinatra-rest gem中做类似下面的事情,但这看起来很傻:
@PLURAL.collect! { |obj| obj.to_json }
Run Code Online (Sandbox Code Playgroud) 假设我有一张桌子世界.
我在表格中有一个名为foo的字段.我想查询World表并选择foo,但我想在后续转换为JSON输出时将其别名为bar.
有没有办法为这一个ActiveRecord查询别名字段名称?不希望通过整个应用程序对字段进行别名.
我正在使用 将哈希值转换为 JSON to_json,但转换后的字符串充满了反斜杠。如果我使用puts,它会显示正确的字符串,但如果我传入 a HTTP::NET request.body,则该字符串充满反斜杠。
data = {"a" => "b", "c" => "d", "e" => "f"}
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path, {'Content-Type' =>'application/json',
'Authorization' => "xyz")
req.body = data.to_json
res = http.request(req)
Run Code Online (Sandbox Code Playgroud)
req.body正在发送:
"{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"}"
Run Code Online (Sandbox Code Playgroud)
我的请求因此失败。
我需要将数据发送为
"{"a" => "b", "c" => "d", "e" => "f"}"
Run Code Online (Sandbox Code Playgroud)
在请求正文中。