在Sinatra助手中生成JavaScript
作者:互联网
我在基于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定义辅助方法.您可以在视图中使用此块中定义的任何方法:
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过滤器将块包装在< script>中和<![CDATA [标签,帮助器将创建您想要的实际JavaScript. 还有一件事:在你的例子中,数组是User.all,它看起来像是对activerecord或类似的东西的调用,在这种情况下你可能没有一个字符串数组,但是有一些其他对象可能没有给你想要的结果.您可能需要执行以下操作:
:javascript
#{js_array("names", User.all.collect(&:pretty_name)}
(其中pretty_name是User对象上返回打印名称的方法),或者可能更改帮助方法以提取要使用的字符串.
标签:javascript,ruby,haml,sinatra 来源: https://codeday.me/bug/20190827/1735814.html