如何在视图中只运行一次代码
我有一个名为'_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代码'将只运行一次。我该怎么办?
这可能不是你的问题的最佳解决方案,但创建一个帮手,将产生只有一次是不是很麻烦:
助手
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 %>
<% if [email protected]_flag && @once_flag=1 %>
<script>
function aaa() {}
</script>
<% end %>
谢谢,您的代码可以解决我的问题。但是有一个小问题:我需要关注实例变量“once_flag”的名称,否则可能会破坏其他代码。 – Freewind 2010-06-14 14:31:59
嗨Freewind 您可以将@once_flag参数设置为部分参数。类似的,你可以在启动循环时创建一个计数器,并通过初始计数(在上面的例子中为1),其余的将是!= 1,这个代码将工作 ,你可以保留1作为默认参数所以当你从另一个地方打电话时,你不需要做额外的工作 欢呼声 sameera – sameera207 2010-06-14 15:42:27
@ sameera207,你的解决方案也工作,谢谢。但我仍然希望有一个像我之前提到的“run_once”这样的通用帮助方法,我不需要关心任何东西,只是使用它。可能吗? – Freewind 2010-06-14 15:55:14
测试以查看函数是否已被定义。如果没有,定义/运行
<script type="text/javascript">
/*<![CDATA[*/
if (!aaa) {
function aaa() {}
}
/*]]>*/
</script>
这只是一个例子。其实,代码可能是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它真的应该是一个部分。
为什么不移动到父视图? – 2010-06-14 14:59:30
因为此部分可能会由不同的父级使用。如果我将它移动到父项,这意味着每个父母都需要定义该功能 – Freewind 2010-06-14 15:20:27