Rails用coffeescript

时间:2015-05-17 14:52:55

标签: ruby-on-rails ajax json coffeescript morris.js

在我的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 %>`

2 个答案:

答案 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)