Ruby on rails 如何在视图中只运行一次某些代码
我有一个名为“_comment.erb”的局部视图,它可能被父级多次调用(例如在循环中)。“_comment.erb”看起来像:Ruby on rails 如何在视图中只运行一次某些代码,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个名为“_comment.erb”的局部视图,它可能被父级多次调用(例如在循环中)。“_comment.erb”看起来像: <script> function aaa() {} </script> <%= comment.content %> <%=link_to_function 'Do', 'aaa()' %> 函数aaa(){} 您可以看到,如果多次调用“_comment.erb”,javascript函数“aaa”将被多次重新
<script>
function aaa() {}
</script>
<%= comment.content %>
<%=link_to_function 'Do', 'aaa()' %>
函数aaa(){}
您可以看到,如果多次调用“_comment.erb”,javascript函数“aaa”将被多次重新定义。我希望它只能定义一次,但我不想将其移动到父视图
我希望有一种方法,比如“运行一次”,我可以这样使用它:
<%= run_once do %>
<script>
function aaa() {}
</script>
<% end %>
<%= comment.content %>
<%=link_to_function 'Do', 'aaa()' %>
函数aaa(){}
无论我调用了多少次“\u comment.erb”,“run\u once”中的代码将只运行一次。我该怎么办?
<% if !@once_flag && @once_flag=1 %>
<script>
function aaa() {}
</script>
<% end %>
函数aaa(){}
函数aaa(){}
测试功能是否已定义。如果没有,请定义/运行它
<script type="text/javascript">
/*<![CDATA[*/
if (!aaa) {
function aaa() {}
}
/*]]>*/
</script>
/**/
测试功能是否已定义。如果没有,请定义/运行它
<script type="text/javascript">
/*<![CDATA[*/
if (!aaa) {
function aaa() {}
}
/*]]>*/
</script>
/**/
试试这样的方法
在布局中创建一个名为“flag”的隐藏文本字段,并将其默认值设置为0
(确保不将此内容包含在部分内容中)
在你的部分脚本中
检查该值,如果是!=1执行您的功能
这不是一个可靠的解决方案,但由于您的逻辑需要一些标志来跟踪执行的数量,因此这将是一个解决方法
干杯,
sameera试试这样的东西 在布局中创建一个名为“flag”的隐藏文本字段,并将其默认值设置为0 (确保不将此内容包含在部分内容中) 在你的部分脚本中 检查该值,如果是!=1执行您的功能 这不是一个可靠的解决方案,但由于您的逻辑需要一些标志来跟踪执行的数量,因此这将是一个解决方法 干杯,
sameera嗯,如果你想定义一次东西,你可以定义另一个partail
在中定义javascript并在此处多次呈现_comment.erb partial。它应该解决这两个问题。嗯,如果你想定义一次东西,你可以定义另一个partail
在中定义javascript并在此处多次呈现_comment.erb partial。它应该同时解决这两个问题。这可能不是解决问题的最佳方法,但是创建一个只产生一次结果的助手并不太麻烦: 助手
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
def输出一次(名称和块)
@输出|once|u块| |=[]
除非@output\u once\u阻塞。包括?(名称)
@output_once_blocks这可能不是问题的最佳解决方案,但是创建一个只产生一次的帮助器并不太麻烦:
助手
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
def输出一次(名称和块)
@输出|once|u块| |=[]
除非@output\u once\u阻塞。包括?(名称)
@output_once_blocks据我所知,没有像“run_once”这样的函数可用,因此您要么自己编写,要么以另一种方式处理代码。对于javascript,只需在application.js文件中定义它,然后可以随时调用它。如果它是ruby代码,那么就把它放在你的应用程序助手中,对于HTML,它应该是部分的。据我所知,没有像“run\u once”这样的函数可用,所以你要么自己编写,要么用另一种方式处理代码。对于javascript,只需在application.js文件中定义它,然后可以随时调用它。如果是ruby代码,请将其放入应用程序帮助程序中,对于HTML,它应该是部分代码。谢谢,您的代码可以解决我的问题。但是有一个小问题:我需要注意实例变量“once\u flag”的名称,否则它可能会破坏其他代码。Hi Freewind您可以将@once\u flag参数设置为部分参数。例如,您可以在启动循环时创建一个计数器并传递初始计数(在上述情况下为1),然后剩余的将是!=1,这段代码可以工作,您可以保留1作为默认参数,这样当您从其他地方调用它时,您就不需要做额外的工作了sameera@sameera207,您的解决方案也有效,谢谢。但我仍然希望有一个像我提到的“run_once”这样的常用助手方法,我不需要关心任何事情,只要使用它。可能吗?谢谢,你的代码可以解决我的问题。但是有一个小问题:我需要注意实例变量“once\u flag”的名称,否则它可能会破坏其他代码。Hi Freewind您可以将@once\u flag参数设置为部分参数。例如,您可以在启动循环时创建一个计数器并传递初始计数(在上述情况下为1),然后剩余的将是!=1,这段代码可以工作,您可以保留1作为默认参数,这样当您从其他地方调用它时,您就不需要做额外的工作了sameera@sameera207,您的解决方案也有效,谢谢。但我仍然希望有一个像我提到的“run_once”这样的常用助手方法,我不需要关心任何事情,只要使用它。可能吗?这只是一个样本。实际上,代码可能是javascript或ruby代码,甚至是html。我希望有一个像“run_once”这样的助手方法可以为我做到这一点。这只是一个示例。实际上,代码可能是javascript或ruby代码,甚至是html。我希望有一个像“run_once”这样的助手方法可以帮我完成这个任务。为什么不移动到父视图呢?因为这个部分可能会被不同的父视图使用。如果我将其移动到父级,这意味着每个父级都需要定义该函数为什么不移动到父级视图?因为此部分可能由不同的父级使用。如果我将其移动到父级,这意味着每个父级都需要定义该函数Fix:concat(捕获(block)、block.binding)->concat(捕获(&block)、block.binding)Fix:concat(捕获(block)、block.binding)->concat(捕获(&block)、block.binding)