从哈希中的 ruby 字符串编写 javascript 函数



我有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>
}

最新更新