微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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对象上返回打印名称方法),或者可能更改帮助方法提取要使用的字符串.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐