我有一个名为'_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 :(得分: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,它确实应该是部分的。