2017-08-25 114 views
3

我有ROR帮助程序,它构建了一些Javascript代码。 在帮助程序中,我有定义此JavaScript代码的选项和变量散列。 其中之一是保存JS函数的字符串,问题是它使用to_json时呈现为字符串而不是函数。从红宝石字符串中写入JavaScript函数哈希

我该如何让它工作?

例子:

在我的帮助我有这样的代码:

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> 
+0

为什么是的,JSON是不是JavaScript的,它不具备*功能*的概念,这就说得通了。 –

回答

0

最简单的方法是用像这样的正则表达式去除周围的引号。

"<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> 

你想要哪一个不是complety。 我只是建立一个字符串,而不是使用json方法。

html = %Q{ 
    <script type='text/javascript'> 
    jQuery.ajax({ 
     url: '#{h[:url]}', 
     async: #{h[:async]}, 
     success: #{h[:success]} 
    }); 
    </script> 
} 
2

您可以创建一个字符串h哈希而不是使用to_json的;例如:额外的双引号("),以保持他们在最终的字符串添加到'"/some/url"'

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 

通知。

输出:

<script type='text/javascript'> jQuery.ajax({url: "/some/url",async: false, success: function(result) { alert(result); }}); </script> 
+0

这是一个非常好的主意,谢谢...! – Dror

0

我会做,使用定界符语法和字符串插值:

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