编程语言
首页 > 编程语言> > 在Sinatra助手中生成JavaScript

在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