【问题标题】:Rails: Running a script based on values in the databaseRails:根据数据库中的值运行脚本
【发布时间】:2012-11-06 02:36:20
【问题描述】:

现在,我想在我的应用的每个页面上运行一些工具提示 JavaScript,但前提是当前用户的模型在我的数据库中将 User.advanced_tooltips 设置为 true。

从概念上讲,让这个 JavaScript 根据数据库中的值有条件地触发的最佳方法是什么?我在让 JavaScript 和 Rails 进行通信时遇到了一些问题。

【问题讨论】:

标签: javascript ruby-on-rails


【解决方案1】:

假设您使用的是 jquery,您可以这样做:

<script type='text/javascript'>
$(document).ready(function() {
   var advtt = '<%= @user.advanced_tooltips ? "yes" : "no" %>';
   if ( advtt == 'yes')
     # ?? add css, or whatever
});
</script>

这假设在渲染包含上述 Javascript 的视图之前在控制器中设置了 @user。

【讨论】:

  • 这就是我通常跟踪我的用户的方式,在每个控制器操作之前设置 @user 的 before_filter 中。然而,这个项目使用 session 变量来存储当前用户的 id,而且——因为我在这个项目的团队中途完成——主要的重构并不是一个真正的选择。
  • 我不明白这需要进行重大重构。您需要做的就是将 @user.advanced_tooltips 替换为 User.find(session[:user_id]).advanced_tooltips 或其他任何内容。
【解决方案2】:

一个干净简单的解决方案是将javascript函数包装在rails逻辑中:

<script type='text/javascript'>

  var setupTooltips = function() {
    // do something here
  }

  $(document).ready(function() {

    <% if current_user.advanced_tooltips %>
      setupTooltips();
    <% end %>

  });

</script>

【讨论】:

  • 不幸的是,这就是我最初尝试解决方案的样子。我尝试将代码嵌入到我的布局中(直到我在弹出模式无布局中呈现某些视图之前一直有效)和 js.erb 文件中(它显然无法访问会话变量,这就是我的方式存储用户)
【解决方案3】:

这是我最终使用的解决方案(考虑到这个项目施加的非常奇怪的限制):

首先,我设置了一个控制器路由来查找当前用户,然后将其 advanced_tooltip 值呈现为文本。

然后,在我的 application.js 中,我使用 $.get 对该路由进行了 AJAX 调用,然后检查结果是否 == "true" 以确定用户是否启用了高级工具提示。

这是一个混乱的解决方案(上面列出的实际上更好),但由于我在完成其他人的项目时遇到了一些非常严格的限制,所以我必须这样做。

仍然对两个评论投了赞成票,因为它们是有效的并且在正常情况下完全可以工作。

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2010-11-19
    • 2015-03-08
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多