ruby-on-rails - Chartkick on rails:根据数据改变图表样式
问题描述
我正在使用 chartkick highchart 在 rails 应用程序中显示一些图表。我的问题是可以根据图表控制器提供的数据更改图表的样式吗?
例如,这是 chart.html.erb 中的代码:
<%= line_chart charts_cards_history_by_day_path, refresh: 10 %>
有没有办法<%= bar_chart charts_cards_history_by_day_path, refresh: 10 %>
根据图表控制器的决定将该代码更改为?因此,图表样式是折线图还是条形图取决于控制器。
谢谢,兰迪
控制器来源:
def cards_history_by_day
begin
p_board_id = params['post']['board_id']
render json:
[{name: "No. of cards", data: ListsCountPerday.joins(:t_list).where('lists_count_perdays.t_board_id = '+p_board_id+' and
t_lists.t_list_type_id != 1').group(:date).pluck('date, sum(count)')},
{name: "Completed", data: ListsCountPerday.joins(:t_list).where('lists_count_perdays.t_board_id = '+p_board_id+' and
t_lists.t_list_type_id = 5').group(:date).pluck('date, sum(count)')}]
rescue
render json: CardHistory.where('t_list_id = -1').group_by_day(:created_at).count
end
end
视图来源:
# javascript to handle selection and form submission
<%= javascript_include_tag "charts0" %>
# form for user select prefered data to show
<%= form_tag charts0_cards_history_by_day_path , remote: true do %>
<label for="team_name">Team: </label>
<%= collection_select "post", "authentication_id",
Authentication.order(:team_name), :id, :team_name, prompt: "Please select" %>
<label for="team_name">Board: </label>
<%= grouped_collection_select "post", "board_id",
Authentication.order(:team_name), :t_board, :team_name, :id, :name, prompt: "Please select" %>
<%= submit_tag 'Apply', class: 'btn btn-primary' %>
<% end %>
#function to show the chart which data taken from the controller
<%= line_chart charts0_cards_history_by_day_path, refresh:10 %>
javascript源代码:
#javascript to update chart data once form is submitted
$(document).ready(function() {
$('form').submit(function(e) {
e.preventDefault();
data = $(this).serialize();
Chartkick.eachChart( function(chart) {
chart.updateData(chart.getDataSource() + '?' + data);
});
return false;
});
});
更新了控制器源(在cards_history_by_day.js.erb 中为Chart.last.data 返回了一个未初始化的常量错误):
def cards_history_by_day
begin
p_board_id = params['post']['board_id']
#call the .js.erb file (based on the JS tutorial given)
respond_to do |format|
format.js
end
rescue
render json: CardHistory.where('t_list_id = -1').group_by_day(:created_at).count
end
end
解决方案
只需根据要测试的数据条件在视图中添加条件逻辑,例如:
<% if @data.condition %>
<%= line_chart charts_cards_history_by_day_path, refresh: 10 %>
<% else %>
<%= bar_chart charts_cards_history_by_day_path, refresh: 10 %>
<% end %>
推荐阅读
- r - 使用 gganimate 在 R 中按顺序动画变化的密度图
- python - USB 网络摄像头不再适用于 opencv:VIDIOC_QBUF: Invalid Argument
- discord.js - 如何让不和谐 oauth2 加入不和谐服务器
- typescript - 键入复合函数的正确方法是什么?
- performance - 以下嵌套循环中第二个 for 循环的时间复杂度是多少?
- unix - 查找在同一行上多次出现模式的文件
- javascript - 用java脚本添加零小数
- amazon-web-services - EventType:查看器请求导致 503 的 lambda 边缘
- c++ - 如何使用 boost/beast 从 HTTP POST 请求中解析和提取有效负载?
- julia - 在 Julia 中初始化任何变量