在我的Rails应用程序中,我有一个morris.js折线图,在初始页面加载时可以正常工作。我现在想要完成的是在表格中的某些best_in_place字段更新时通过ajax:success
)动态更新此图表。
更新morris.js图表需要传入一个新的哈希数组,例如(在我的例子中):[{"month":"2014-05","cashposition":3},{"month":"2014-06","cashposition":1}]
。我的model_method cash_position
创造了这个就好了。
这是问题所在。在CoffeeScript的ajax:success
函数中,我无法从模型方法cash_position
访问哈希数组。说这个散列数组没有正确转换为json可能更为正确。
我已经设置了一个控制器路由/cash_position
来将哈希数组渲染为json,但json呈现如下:
[{"month"=>"2015-04", "cashposition"=>11}
这会传递一个对象而不是所需的哈希数组,因此图表会忽略它。
如何以散列数组的形式访问方法的结果?仅供我在下面.data()
中手动输入一系列哈希值,我已经成功更新了图表,所以我确信唯一的问题就是访问这个哈希数组以及它如何转换为json
static_pages.coffee
$('.update-percent').on 'ajax:success', (event, data, status, xhr) ->
data = $.ajax({url: "/payment_schedules/cash_position.json"})
console.log(data)
window.lineChart.setData(data)
console.log
输出data
responseText
显示一个带有上述不正确json输出的单个对象,而不是哈希数组。
更新了控制器代码
控制器
...
def cash_position
@payment_schedule = PaymentSchedule.find(params[:id])
end
更新了cash_position.json.erb查看模板
`<%= @payment_schedule.cash_position %>`
答案 0 :(得分:0)
您不需要/想要一个用于渲染JSON的视图。 基本上JSON视图很慢,因为你是串联字符串,而不是转换Ruby对象,这是在高度优化的C代码中完成的。
只需使用render json:
def cash_position
@payment_schedules = PaymentSchedule.find
respond_to do |f|
f.json { render json: @payment_schedule.cash_position }
end
end
对于更复杂的要求,你可能想要使用真棒宝石active_model_serializers,它也很容易测试。
另外你的ajax处理程序有点不对(对不起我在CS的垃圾)。
$('.update-percent').on('ajax:success', function(event, data, status, xhr){
// data in this scope is whatever the previous ajax call returned.
// masking the variable is bound to lead to confusion.
var promise = $.ajax({
url: "/payment_schedules/cash_position.json",
dataType: 'json'
});
promise.done(function(cash_positions){
// this is just an example of how you can use callback chaining
// to process the data.
return $.map(cash_positions, function(cp){
});
});
promise.done(function(continuation){
window.lineChart.setData(continuation);
});
});
如果您使用上述模式,则可以避免使用图表所具有的任何数据结构要求来污染您的API。
答案 1 :(得分:0)
@papirtiger关于控制器代码是正确的,但我们最终使用JQuery的deferred.then()
方法来实现这一点:
coffeescript
$.ajax(
url: '/payment_schedules/cash_position.json'
dataType: 'json'
).then (data) ->
window.lineChart.setData(data)