我有ROR Helper来构建一些Javascript代码。 在帮助程序中,我有定义此 javascript 代码的选项和变量的哈希值。 其中之一是包含JS函数的字符串,问题是它在使用to_json时呈现为字符串而不是函数。
我怎样才能让它工作?
例:
在我的助手中,我有以下代码:
h = {url: '/some/url', async: false}
h[success] = "function(result) {alert(result);}"
"<script type='text/javascript'> jQuery.ajax(#{h.to_json}); </script>"html_safe
此代码将生成:
<script type='text/javascript'>
jQuery.ajax({
url: '/some/url',
async: false,
success: "function(result) {alert(result);}"
});
</script>
我不会实现的是该代码(在成功部分中没有".."(:
<script type='text/javascript'>
jQuery.ajax({
url: '/some/url',
async: false,
success: function(result) {alert(result);}
});
</script>
你可以用h
哈希创建一个字符串,而不是使用to_json
;例如:
def js_code
h = {url: '"/some/url"', async: false}
h[:success] = "function(result) { alert(result); }"
s = h.map { |k, v| "#{k}: #{v}" }.join(",")
"<script type='text/javascript'> jQuery.ajax({#{s}}); </script>".html_safe
end
请注意,额外的双引号 ("
( 被添加到'"/some/url"'
中,以便将它们保留在最终字符串中。
输出:
<script type='text/javascript'> jQuery.ajax({url: "/some/url",async: false, success: function(result) { alert(result); }}); </script>
我会使用 heredoc 语法和字符串内插来做到这一点:
def some_helper_method
h = { url: '/some/url', async: false }
<<-HTML
<script type='text/javascript'>
jQuery.ajax({
url: '#{ h[:url] }',
async: #{ h[:async] },
success: function(result) {
alert(result);
}
});
</script>
HTML
end
最简单的方法是使用这样的正则表达式删除周围的引号。
"<script type='text/javascript'> jQuery.ajax(#{h.to_json}); </script>".gsub(/"success":"(.*)"/, '"success":1')
这给了
<script type='text/javascript'> jQuery.ajax({"url":"/some/url","async":false,"success":function(result) {alert(result);}}); </script>
这不是你想要的。 我只会构建一个字符串,而不是使用 json 方法。
html = %Q{
<script type='text/javascript'>
jQuery.ajax({
url: '#{h[:url]}',
async: #{h[:async]},
success: #{h[:success]}
});
</script>
}