如何在视图中混合JS和Ruby代码以供以后的JS使用?

时间:2012-02-08 15:09:42

标签: javascript ruby-on-rails ruby coffeescript

我正在使用jquery UI DatePicker小部件来显示日历。日历中的每一天都由Result对象的集合表示,它们属于Objective模型。 如果一天的所有结果都是成功的,我会在日历单元格上设置一个类,使其变为绿色。如果其中至少有一个失败了,我就把它弄成红色。如果没有结果,我会把它变成灰色。现在,我做这样的事情:

<%= start_day .. end_day do |day| %>
   <div class="hidethis" id="<%= [day.year,day.month,day.year].join(",") %>" value="<%= objective.result_status_for_day(day)%>"/>
<% end %>

我将数据存储在隐藏的div中,之后,当我正在初始化日历时,在beforeShowDay中,我正在通过div id找到与我相关的那个,并且我设置了负责着色的类细胞。有没有其他方法可以做到这一点,或者这是其他人在实践中使用的东西?

2 个答案:

答案 0 :(得分:2)

使用HTML进行数据存储似乎有点过分了。为什么不将数据存储为JavaScript数据?像这样:

<script type="text/javascript">
    window.app = window.app || { };
    window.app.objective_data = <%= @raw_objective_data.to_json.html_safe %>;
</script>

然后在Ruby中设置原始数据,将其保留在@raw_objective_data中,然后在初始化过程中将其加载到客户端模型中。或者您可以通过简单的AJAX调用将数据直接加载到(Java | Coffee)脚本中。

您还希望在'</script>'中避免@raw_objective_data.to_json和类似的事情,您可以了解over here

答案 1 :(得分:1)

我不会使用id和value属性。我不认为div标签甚至支持value属性。相反,我会使用数据属性,它允许您编写有效的HTML标记,同时在页面中嵌入数据。

<%= start_day .. end_day do |day| %>
   <div class="hidethis" data-date="<%= [day.year,day.month,day.year].join(",") %>" data-value="<%= objective.result_status_for_day(day)%>"></div>
<% end %>

var value = $('div').attr('data-value');