Rails:仅在满足某个条件时才包括JS

时间:2015-08-23 19:28:15

标签: javascript ruby-on-rails

我想在每个页面上包含一段JS,但只有session以某种方式设置。

我有一个带有计时器按钮的侧边栏。一旦用户登录,侧边栏(layouts/_sidebar.html.erb)就会包含在每个页面的布局中。

单击计时器按钮一次,计时器启动。 LogsController#start_from_button会在session[:timer_start]中记录点击事件时间。

再次点击该按钮,LogsController#finish_from_button会在session[:timer_finish]中记录第二次点击时间。然后,它会为新Log呈现一个表单,其中 START FINISH 字段预填充session数据。最后,它会清除上述session值。

不幸的是,在页面刷新时,计时器完全重置。我不希望这种情况发生。我希望它继续下去,直到用户再次点击该按钮。

我的第一个修复是在每次操作之前检查ApplicationController中的计时器状态。然后,如果session[:timer_start]不是nil,我可能会包含必要的JS,以使计时器从session[:timer_start]继续。但我知道这样做的唯一方法就是非常难看:

# application_controller.rb

before_action :check_timer_status
...
def check_timer_status
  if session[:timer_start]
    # include page-specific JS
  end
end

我也希望模板正常显示。

A)如果这看起来很骇人听闻,那么实现这一目标的更好方法是什么,或者

B)如果它不太hacky,我怎么能从该控制器动作中包含特定于页面的JS?

2 个答案:

答案 0 :(得分:0)

要回答您的问题 - 您可以在视图中使用content_for(:include_js){ @include_js}

<% yield(:include_js) %> 
  <% javascript_include_tag ..... %>
<% end %>

在主布局头部分。 @include_js在哪里 - 特定条件的布尔值。

但我相信你不应该排除js。因为js加载一次然后浏览器使用缓存副本。使用cookie来保持timer_start,并通过js脚本读取它。

答案 1 :(得分:0)

以下是如何做到这一点。

  1. 获取jquery-stopwatch库。

  2. 将其放入public/assets/javascripts目录

  3. 通过输入:

    将其添加到您的应用程序布局中

    <%= javascript_include_tag 'jquery.stopwatch' %>

  4. 您必须在计算机中存储计时器停止的时间。只需触发事件即可在数据库中的某处记录Time.now

  5. 在application_helper中创建一个帮助方法。您正在尝试记录自计时器启动以来经过的毫秒数。您可以通过将按钮放在表单中或通过AJAX将经过的毫秒数发送到数据库。它取决于你。

    def time_elapsed @time_now = Time.now @time_timer_stopped = #this is where you query your db and pull out the time the timer has been stopped. return (@time_now - @time_timer_stopped)*1000 #returns the miliseconds passed after you stopped the time end

    1. 将此脚本放在time_elapsed方法可到达的位置
    2. $('#someDiv').stopwatch({startTime: <%= time_elapsed %>}).stopwatch('start') </script>

      瞧,瞧,你有秒表。