Rails 3和jQuery - 如何将Ruby代码添加到元素中

时间:2011-02-02 03:34:19

标签: jquery ruby-on-rails

我正在尝试使用jQuery,jQuery表单插件和Ruby on Rails来创建一个AJAX图像上传器。

我已经完成了所有图像上传和ActiveRecord创建,但是AJAX部分本身不起作用 - 它应该导致<div>重新呈现图片部分的集合。但是,我试图插入的Ruby代码被渲染为字符串而不是被执行。

的application.js:

$(document).ready(function(){
    $("#upload input").change(function(event){
        $(this).parent().ajaxSubmit({
            beforeSubmit: function(a,f,o) {
                o.dataType = 'json';
            },
            complete: function(XMLHttpRequest, textStatus) {
                $("#img_div").html('<%= escape_javascript(render(@picture.idea.pictures)) %>');
            },
        });
    });
});

当文件字段更改时,将表单绑定到ajaxSubmit,这很正常。 .html()似乎有问题,因为字符串<%= escape_javascript(render(@picture.idea.pictures)) %>只是打印在<div>

_form.html.erb:

<div id="img_div"><%= render @picture.idea.pictures %></div>

该行在页面刷新时可正常工作以呈现集合。

我知道Ruby代码没有问题,因为我以前在 create.js.erb 文件中有这个确切的行。我会继续使用这种方法,除非我现在使用ajaxSubmit,我无法将创建操作呈现为JS - 它总是呈现为HTML。

所以理论上我可以用两种方法解决问题 - 找出为什么ruby代码在 application.js 中呈现为字符串,或者将pictures#create呈现为JS。

我做错了什么事情没有发生?

编辑:

好的,所以我似乎无法在 applications.js 中使用Ruby代码或变量,并且尝试将Ruby集合传递给JavaScript不起作用,因为我可以' t访问重新创建正确HTML所需的所有属性。

我需要的是确保pictures#create操作被称为JS的方法。然后我可以使用format.js来确保使用 create.js.erb ,我知道我的代码可以使用。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果它位于视图中的脚本中,则只能在javascript中嵌入ruby代码。 public/javascripts/中的任何内容都不会命中服务器,因此无法找到ruby变量。

您要做的是在包含脚本之前将ruby变量存储在javascript变量中。

<head>
 <script type="text/javascript">
   var youJsVariable = <%= ruby_array %>;
 </script>
 <%= javascript_include_tag :defaults, 'application' %>
</head>

通过这种方式,您不必编写大量的内联脚本,这些脚本会让那些不引人注目的人感到厌烦。

答案 1 :(得分:0)

问题是你试图在浏览器大小的JavaScript中运行ruby代码:

'<%= escape_javascript(render(@picture.idea.pictures)) %>'

相反,您应该使用HTML方法设置已经渲染的内容(@ picture.idea.pictures)