我在基于 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_name
是 User
对象上的一个方法,它返回一个打印名称),或者改变辅助方法以提取您要使用的字符串。
关于javascript - 在 Sinatra 助手中生成 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5984119/