如何在视图中只运行一次代码

时间:2010-06-14 14:20:45

标签: ruby-on-rails ruby

我有一个名为'_comment.erb'的局部视图,它可能被父母多次调用(例如在循环中)。 '_comment.erb'看起来像:

<script>
function aaa() {}
</script>

<%= comment.content %>
<%=link_to_function 'Do', 'aaa()' %>

您可以查看是否多次调用'_comment.erb',javascript函数'aaa'将被多次重新定义。我希望它只能定义一次,但我不想将其移动到父视图。

我希望有一种方法,比如'run_once',我可以像这样使用它:

<%= run_once do %>
  <script>
  function aaa() {}
  </script>
<% end %>

<%= comment.content %>
<%=link_to_function 'Do', 'aaa()' %>

无论我多少次调用'_comment.erb','run_once'中的代码只会运行一次。我该怎么办?

6 个答案:

答案 0 :(得分:3)

<% if !@once_flag && @once_flag=1 %>
  <script>
  function aaa() {}
  </script>
<% end %>

答案 1 :(得分:3)

这可能不是解决问题的最佳方案,但创建一个只产生一次的助手并不会太麻烦:

<强>辅助

def output_once(name, &block)
    @output_once_blocks ||= []
    unless @output_once_blocks.include?(name)
        @output_once_blocks << name
        concat(capture(block), block.binding)
    end
end

<强>用法

<% output_once :define_aaa do %>
    Your stuff here
<% end %>

答案 2 :(得分:0)

测试是否已定义该功能。如果没有,请定义/运行它

   <script type="text/javascript">
   /*<![CDATA[*/
      if (!aaa) {
        function aaa() {}
      }
   /*]]>*/
    </script>

答案 3 :(得分:0)

尝试这样的事情

在您的布局中创建一个名为“flag”的隐藏文本字段,并将其默认值设为0

(确保你不要在你的部分中包含这个)

部分脚本中的

检查该值,如果是!= 1执行您的功能

这不是一个可靠的解决方案,但由于您的逻辑需要一些标记来跟踪执行次数,这将是一种解决方法

欢呼声, sameera

答案 4 :(得分:0)

嗯,如果你想定义一次东西,你可以定义另一个部分。定义javascript并在这里多次渲染_comment.erb部分。它应该处理这两个问题。

答案 5 :(得分:0)

据我所知,没有像“run_once”这样的函数可用,所以你要么自己编写它,要么用另一种方式处理你的代码。对于javascript,只需在application.js文件中定义它,然后您可以随时调用它。如果它是ruby代码,那么将它放在你的应用程序助手中,对于HTML,它确实应该是部分的。