Rails:如何从控制器返回有效的javascript?

时间:2014-01-26 14:09:54

标签: javascript ruby-on-rails

A在控制器中执行以下操作:

def new_messages
    @new_msgs = Message.find(:all, order: 'id desc', limit: 12)
    respond_to do |format|
        format.js
    end
end

和javascript erb文件'new_messages.js.erb'new_messages操作后返回客户端:

var data = '';
<% @new_msgs.each do |m| %>
    data += '<tr><td><%= m.user.name %></td><td><%= m.text %></td><td><%= m.created_at %></td></tr>';
<% end %>

$('#messages-table').html('');
$('#messages-table').append(data);

这里我只为新邮件撰写行,并尝试将结果附加到我的表'#messages-table'。但问题是:浏览器从服务器获取无效的javascript(根据网络 - &gt;请求 - &gt; Chrome开发者工具中的响应标签):

var data = '';
    data += '<tr><td>dime</td><td>cowboys from hell
</td><td>2014-01-24 15:11:36 UTC</td></tr>';

$('#messages-table').html('');
$('#messages-table').append(data);

第2行中的换行导致SyntaxError: Unexpected token ILLEGAL。是否有可能返回我的new_messages.js.erb文件中的javascript?如何避免这种危险行为?

2 个答案:

答案 0 :(得分:1)

你应该使用escape_javascript或它的别名j来逃避回车,JavaScript的单引号和双引号。

因此,将new_messages.js.erb更新为以下内容应该有效:

var data = '';
<% @new_msgs.each do |m| %>
    data += '<%= j "<tr><td>#{m.user.name}</td><td>#{m.text}</td><td>#{m.created_at}</td></tr>" %>';
<% end %>

$('#messages-table').html(data);

您也可以仅使用html(data)代替html(''),然后append(data)

答案 1 :(得分:1)

js.erb文件的主要优点是使用了html模板。你应该做类似下面的事情。

_your_partial.html.erb

<% @new_messages.each do |m| %>
<tr><td><%= m.user.name %></td><td><%= m.text %></td><td><%= m.created_at %></td></tr>
<% end %>

js.erb

$('#messages-table').html('');
$('#messages-table').append(<%=j render "your_partial" %>);