Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在视图中只运行一次某些代码_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何在视图中只运行一次某些代码

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”将被多次重新

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

<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)