我正在使用Rails 4中的JBuilder渲染一些学生的JSON.我希望每个学生都有一个"html"属性,其中包含给定学生的HTML部分:
[
{ html: "<b>I was rendered from a partial</b>" }
]
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
json.array! @students do |student|
json.html render partial: 'students/_student', locals: { student: student }
end
Run Code Online (Sandbox Code Playgroud)
但这给了我:
Missing partial students/_student with {:locale=>[:en], :formats=>[:json], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee, :haml]}.
Run Code Online (Sandbox Code Playgroud) 我想渲染一个像这样的jbuilder模板:
json.author do
json.partial! 'user', user: @user
end
json.owner do
json.partial! 'user', user: @user
end
Run Code Online (Sandbox Code Playgroud)
渲染一个部分两次似乎是浪费,我可以像这样渲染吗?
user_json = json.some_render_partial! 'user', user: @user
json.author { user_json }
json.owner { user_json }
Run Code Online (Sandbox Code Playgroud) 我正在使用JBuilder来呈现应用程序的JSON API部分的视图.我遇到的问题是我的DateTimes被渲染成这样:
"2013-07-02T17:03:18.000Z"
...当我真正想要的是这个:
"2013-07-02T17:03:18Z"
我不确定这些小数来自哪里......
我以典型的JBuilder方式渲染字段:
json.my_datetime_field
Run Code Online (Sandbox Code Playgroud)
我的应用中有一个日期格式初始值设定项:
Date::DATE_FORMATS[:default] = '%Y/%m/%d %Z'
Time::DATE_FORMATS[:default] = '%Y/%m/%d %H:%M:%S %Z'
Date::DATE_FORMATS[:month_day_year] = '%m-%d-%Y'
Run Code Online (Sandbox Code Playgroud)
但是,这似乎并没有影响JBuilder,这很好.我希望ISO8601格式来自我的API.顺便说一下,我正在使用Rails 4.0.0决赛.
在我的rails 3.2应用程序中,我使用jbuilder来呈现来自我的JSON api的响应.
我想为所有API响应提供一个通用结构,并且布局可能是保持我的视图DRY的可能解决方案.
例如:我希望每个回复都是以下形式:
{
status: "ok|error|redirect",
data: { ... JSON specific to the current view ... },
errors: [ ... ],
notes: [ ... ]
}
Run Code Online (Sandbox Code Playgroud)
(其中数据的值是视图提供的json结构,其他所有内容都来自布局)
但是:我无法正确地让jbuilder布局屈服于视图.
# in layout
json.data yield
# in view
json.some "value"
Run Code Online (Sandbox Code Playgroud)
结果是:
{"data":"{\"some\":\"value\"}"} # arg! my json has become a string
Run Code Online (Sandbox Code Playgroud)
以另一种方式尝试:
# in layout
yield
# in view
json.data do |json|
json.some "value"
end
Run Code Online (Sandbox Code Playgroud)
结果是 :
{}
Run Code Online (Sandbox Code Playgroud)
有没有人用jbuilder或其他json模板gem /方法做到这一点?
这个juilder github问题表明这是可能的,但表明其他人也有类似的问题.
我看到rabl(https://github.com/nesquena/rabl/)应该支持布局(https://github.com/nesquena/rabl/wiki/Using-Layouts),但我决定不使用由于其他原因(rabl使复杂的json结构成为一场噩梦,特别是在试图控制对象根等时).
当我脚手架时,我不希望它生成这些文件:
invoke jbuilder
create app/views/tests/index.json.jbuilder
create app/views/tests/show.json.jbuilder
Run Code Online (Sandbox Code Playgroud)
但是怎么样?在我的application.rb我有这个:
config.generators do |g|
g.assets false
g.helper false
g.test_framework nil
end
Run Code Online (Sandbox Code Playgroud) 要为大规模应用程序构建api,哪种方法是更好的性能,我应该使用Rabl,Jbuilder还是手动构建json对象?我正在为移动应用程序构建api /端点.
我有1500个小对象来渲染rails 4应用程序中的web服务.我使用json作为格式与jbuilder模板.我已经在app初始化程序中将json引擎更改为oj:
require 'oj_mimic_json'
#MultiJson.use :yajl
Oj.mimic_JSON
# jbuilder json templates
Jbuilder.key_format camelize: :lower
Run Code Online (Sandbox Code Playgroud)
单个渲染的json对象如下所示:
center: {lat: 45.962153536249, lon: 7.68207088549831}
lat: 45.962153536249
lon: 7.68207088549831
n: "Zermatt-Cervinia"
st: 80
sy: 0
Rendered json_partials/_snow_in_resort.json.jbuilder (0.5ms)
Rendered json_partials/_snow_in_resort.json.jbuilder (0.5ms)
....
Rendered resorts/find.json.jbuilder (4213.4ms)
Completed 200 OK in 4351ms (Views: 3924.3ms | ActiveRecord: 306.8ms | Solr: 0.0ms)
Run Code Online (Sandbox Code Playgroud)
但是我的本地主机上仍然需要150毫秒的101 kb,这对于我想在UI上完成的任务来说太慢了.我需要做些什么来加速这里?我应该检查哪些事项?我很感激帮助.最好,菲利普
更新
我将我的活动记录查询优化到ActiveRecord:77.8ms,但视图渲染仍然太慢
假设我有一个Person类和一个Gang类
class Person
belongs_to :gang
attr_accessible :name, :secret
def to_builder
Jbuilder.new do |app|
person.id id
person.name name
end
end
end
class Gang
has_many :people
attr_accessible :name
end
Run Code Online (Sandbox Code Playgroud)
如何从视图中使用此to_builder方法?
例如
#app/views/gang/show.json.jbuilder (@gang set by the controller)
json.gang do |json|
json.name @gang.name
json.gang_members(@gang.people) do |person|
#how do I delegate to the person.to_builder here?
end
end
Run Code Online (Sandbox Code Playgroud)
请注意,我不想只使用默认的Person.as_json,因为我不想secret在Person上呈现属性.
我尝试过的大多数事情最终都是渲染了Person.as_json,而不是Person.to_builder.
我希望在jbuilder视图中显示错误消息.例如,我可能有的一条路线可能是:
/foos/:id/bars
如果:id用户提交的内容不存在或无效,我希望能够在我的index.json.builder文件中相应地显示错误消息.
使用Rails,完成这项工作的最佳方法是什么?控制器可能具有以下内容:
def index
@bar = Bar.where(:foo_id => params[:id])
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,params[:id]可能是nil,或该对象可能不存在.我不确定这里做的最好的事情是在控制器中处理它并显式渲染error.json.builder,或者在index.json.builder视图中处理它.这样做的正确方法是什么,如果它在index.json.builder,params[:id]可以在那里检查?我知道我可以看到反过来@bar.nil?但不确定吗?
我正在尝试使用jbuilder的rails-api gem,而我似乎无法使其工作
这是我的rails-api控制器/ jbuilder视图的示例
的Gemfile
gem 'jbuilder'
Run Code Online (Sandbox Code Playgroud)
控制器app/controller/users_controller.rb
def show
@user = User.find_by(id: params[:id])
end
Run Code Online (Sandbox Code Playgroud)
查看app/views/users/show.json.builder
json.content format_content(@user.id)
Run Code Online (Sandbox Code Playgroud)
根据Jbuilder文档,这应该可以正常工作,但仍然没有返回任何内容.
谢谢您的帮助!