使用Ruby增加一个变量,然后由jQuery使用

时间:2011-09-14 09:32:58

标签: javascript jquery ruby-on-rails ruby

我有一个循环,当涉及某个名称时会跳过该记录并显示其他所有内容:

<% @records.each do |record| %>
            <% if record.task.project.project_name == "SKIP"%>

            <% else %>
            Do some stuff like display...
            <% end %>
            <% end %>

如果循环没有遇到项目名称为“skip”的任何记录,那么我需要使用jquery隐藏某些内容。 如果循环遇到一个或多个“跳过”,那么我需要使用jquery显示一些东西。 我有写的javascript函数:

function show() {
    if (<%= @count %> > 1)
    {
        $(".toil").show();
    }
    else
    {
        $(".toil").hide();
    }
} 

其中@count是ruby初始化为0的变量,每次跳过projectname时都会递增。我尝试用这样的代码做这件事:

 <% @records.each do |record| %>
                    <% if record.task.project.project_name == "SKIP"%>
                    <%= javascript_tag  do -%>
                        <% @count = @count + 1%>
                    <% end -%>
                    <% else %>

我知道这不起作用,但我想知道如何做到这一点,如果有更好的,更“Ruby-Way”。

2 个答案:

答案 0 :(得分:0)

我看到两个选项:

  1. 根本不要使用jquery。在视图中直接根据@count在要显示/隐藏的元素上设置一个类。然后使用CSS隐藏/显示该元素。如果@ count = 0没有理由显示该元素,那么就根本不渲染它。
  2. 在视图中设置javascript变量(不是ruby变量)。像<script>var count = <%= @count %>;</script>之类的东西然后在你的js中使用它。

答案 1 :(得分:0)

@count变量保留在Rails中,并为show()函数生成不同的内容,具体取决于@count的值:

<%= javascript_tag do -%>
  function show() {
      <% if @count > 1 %>
          $(".toil").show();
      <% else %>
          $(".toil").hide();
      <% end %>
  }
<% end -%>

这样您就不需要将@count变量“传输”到jQuery,因为您可以直接在服务器上处理这两种情况,并保持简洁。

修改:您的示例中的javascript_tag似乎使用错误,有关javascript_tag的更多信息/示例,请查看APIDock