我想在每个页面上包含一段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?
答案 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)
以下是如何做到这一点。
获取jquery-stopwatch库。
将其放入public/assets/javascripts
目录
通过输入:
将其添加到您的应用程序布局中 <%= javascript_include_tag 'jquery.stopwatch' %>
您必须在计算机中存储计时器停止的时间。只需触发事件即可在数据库中的某处记录Time.now
。
在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
time_elapsed
方法可到达的位置 $('#someDiv').stopwatch({startTime: <%= time_elapsed %>}).stopwatch('start')
</script>