gpt4 book ai didi

javascript - 在 Sinatra 助手中生成 JavaScript

转载 作者:数据小太阳 更新时间:2023-10-29 07:51:03 25 4
gpt4 key购买 nike

我在基于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com