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

问题描述:

我有一个名为'_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代码'将只运行一次。我该怎么办?

+0

为什么不移动到父视图? – 2010-06-14 14:59:30

+0

因为此部分可能会由不同的父级使用。如果我将它移动到父项,这意味着每个父母都需要定义该功能 – Freewind 2010-06-14 15:20:27

这可能不是你的问题的最佳解决方案,但创建一个帮手,将产生只有一次是不是很麻烦:

助手

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 %>
+0

谢谢,这是最好的解决方案 – Freewind 2010-06-15 05:53:52

+0

修复:concat(capture(block),block.binding) - > concat(capture(&block),block.binding) – Freewind 2010-06-16 07:37:56

<% if [email protected]_flag && @once_flag=1 %> 
    <script> 
    function aaa() {} 
    </script> 
<% end %> 
+0

谢谢,您的代码可以解决我的问题。但是有一个小问题:我需要关注实例变量“once_flag”的名称,否则可能会破坏其他代码。 – Freewind 2010-06-14 14:31:59

+0

嗨Freewind 您可以将@once_flag参数设置为部分参数。类似的,你可以在启动循环时创建一个计数器,并通过初始计数(在上面的例子中为1),其余的将是!= 1,这个代码将工作 ,你可以保留1作为默认参数所以当你从另一个地方打电话时,你不需要做额外的工作 欢呼声 sameera – sameera207 2010-06-14 15:42:27

+1

@ sameera207,你的解决方案也工作,谢谢。但我仍然希望有一个像我之前提到的“run_once”这样的通用帮助方法,我不需要关心任何东西,只是使用它。可能吗? – Freewind 2010-06-14 15:55:14

测试以查看函数是否已被定义。如果没有,定义/运行

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

这只是一个例子。其实,代码可能是JavaScript或Ruby代码,甚至HTML。我希望有一个像“run_once”这样的帮助方法可以为我做到这一点。 – Freewind 2010-06-14 14:51:23

尝试是这样的

在布局中创建一个隐藏的文本框称为“标志”,并使其默认值为0

(确保你不包括这在你的部分)

在你的部分脚本

检查值,如果它是!= 1执行你的功能

这不是一个坚实的解决方案,但因为你的逻辑需要一些标志追踪执行的数量,这将是一个解决办法

欢呼声, sameera

嗯,如果你想一次定义的东西,你可以定义另一个partail。

在此定义javascript并多次渲染_comment.erb多次。它应该照顾这两个问题。

据我所知,没有像“run_once”这样的函数可用,所以你eith呃必须亲自编写它或以另一种方式处理你的代码。对于JavaScript,只需在你的application.js文件中定义它,然后你可以随时调用它。如果它是ruby代码,然后把它放在你的应用程序助手和HTML它真的应该是一个部分。