javascript - 在 Sinatra 助手中生成 JavaScript

标签 javascript ruby sinatra haml

我在基于 Sinatra 的 Web 应用程序中使用 Haml 作为我的模板语言,但我无法根据来自数据库模型的信息生成 JavaScript 数组。本质上,我正在尝试生成一个由用户名组成的 JavaScript 数组,以便在 jQuery-UI 自动完成小部件中使用。

我试过下面的代码,但是没有用。

:javascript
  var names = new Array;
  - User.all.each do |u|
    names.push(#{u})

阅读后,大多数人建议改为在帮助程序中执行任何涉及评估 Ruby 的操作(即在 Haml 中以“-”为前缀的任何操作)。那么,鉴于此,任何人都可以向我解释如何在辅助方法中生成 JavaScript 吗?

最佳答案

这里的问题是您不能在过滤器中使用普通的 haml 功能(例如 :javascript )。然而,过滤器中的文本受制于正常的 ruby​​ 字符串插值,即 #{} 中的任何内容。作为 Ruby 代码执行。

所以让你的例子工作的一种方法是这样的:

:javascript
  var names = new Array;
  #{js = ""
  User.all.each {|u| js << "names.push(#{u})\n" }
  js}

虽然这很乱,但整理它的方法是将它移到助手中。助手只是呈现期间范围内的一种方法(因此可以在 haml 文件中调用它),并生成一些要包含在生成的页面中的文本。

在这种情况下,您生成的是 javascript,但 javascript 只是文本,因此没有问题。辅助方法可能看起来像这样:

def js_array(name, array)
  js = "var #{name} = new Array();\n"
  array.each do |i|
    js << "#{name}.push(#{i})\n"
  end
  js
end

(或者您可以创建文字 javascript 数组:

def js_array(name, array)
  js = "var #{name} = ["
  js << array.collect{|i| "\"#{i}\""}.join(",")
  js << "]"
  js
end

如果你愿意的话。)

接下来,这个方法去哪儿了?在 Sinatra 中,您可以使用 'helpers` method 定义辅助方法。 .此 block 中定义的任何方法都将在您的 View 中可用:

helpers do
  def js_array(name, array)
    js = "var #{name} = new Array();\n"
    array.each do |i|
      js << "#{name}.push(#{i})\n"
    end
    js
  end
end

有了这个,你就可以做

:javascript
  #{js_array("names", User.all)}

在您的 haml 中生成您的 javascript 数组。请注意,您仍然需要 #{}这样 ruby​​ 代码就会被执行,只是现在你在大括号之间只有一个方法调用。 :javascript过滤器会将 block 包装在 <script> 中和 <![CDATA[标签,助手将创建您想要的实际 javascript。

还有一件事:在您的示例中,数组是 User.all ,这看起来像是对 activerecord 或类似内容的调用,在这种情况下,您可能没有字符串数组,而是其他一些可能无法提供您想要的结果的对象。您可能需要执行以下操作:

:javascript
  #{js_array("names", User.all.collect(&:pretty_name)}

(其中 pretty_nameUser 对象上的一个方法,它返回一个打印名称),或者改变辅助方法以提取您要使用的字符串。

关于javascript - 在 Sinatra 助手中生成 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5984119/

相关文章:

ruby-on-rails - 在数组中使用 'order' 的替代方法

ruby - Sinatra 应用程序中的 gzip Assets

javascript - 如何在不使用 ngAnimate 的情况下从 ng-repeat 中删除元素时产生淡出效果?

Ruby - 从目录中获取第二个最近的文件?

javascript - React setState 只返回保存到变量的列表中的最后一项

ruby-on-rails - 在 Windows 上使用 Ruby 进行开发

ruby - Sinatra设置布局的方法

ruby - 如何获取我的 Sinatra 应用程序的代码覆盖率统计信息?

javascript - socket.io.js 404(使用 apache 托管站点)

javascript - 从文件自动填充div