【问题标题】:Reload partial view using AJAX with Json response in Rails在 Rails 中使用带有 Json 响应的 AJAX 重新加载部分视图
【发布时间】:2012-08-04 14:31:30
【问题描述】:

当我调用 $.getJSON 时,我想重新加载 tbody 元素。换句话说,我需要删除所有元素并通过 Json 响应放入新元素。

JS

$(document).ready(function(){
  $('#position').sortable({
    update: function(event, ui) {
        var newOrder = $(this).sortable('toArray').toString();
         $.getJSON('/save_positions.json', {ids:newOrder}, function(data){
            ??????
         });
    }
  });
});

我的观点

# index.html.erb

<tbody id="position">
  <%= render :partial => "activities"%>
</tbody>

局部视图

#_activities.html.erb

<% @activities.each do |activity| %>
  <tr id='<%= activity.id %>'>
    <td><%= activity.position %></td>
    <td><%= link_to activity.id, activity_path(activity) %></td>
    <td><%= activity.name %></td>
    <td><%= activity.estimated %></td>
    <td><%= activity.used %></td>
    <td><%=l activity.created_at %></td>
  </tr>

我的操作(应用程序控制器)

def save_positions
  @activities = Activity.all(:order => 'position')

  respond_to do |format|
    format.json { render :json => @activities }
  end
end

【问题讨论】:

  • 您是想在服务器上生成新的 HTML,然后返回,然后插入到文档中,还是想返回 JSON 并在 JavaScript 中处理以生成新的 HTML?跨度>
  • 随便..我只想重新加载表格而不重新加载页面

标签: jquery html ruby-on-rails ajax json


【解决方案1】:

从您的代码中,我得到的印象是您正在尝试生成新的 HTML 服务器端并将其插入到文档中。如果是这种情况,请尝试以下操作:

$.get( '/save_positions', { ids : newOrder } ).done( function( data ) {

  $( "#position" ).html( $( data ).html() );

} );

如果您真的想返回 JSON,那么您可能希望返回一个对象数组并对其进行迭代以生成新的 HTML,可能使用像 Mustache 这样的模板引擎,例如:

没有模板引擎:

$.getJSON( '/save_positions.json', { ids : newOrder } ).done( function( data ) {

  var positions = [];

  $.each( data, function ( key, val ) {

    // generate an element
    var el = $( "<tr>" );

    // ...

    positions.push( el );

  } );

  $( "#position" ).empty().append( positions );

} );

JS:

$.getJSON( '/save_positions.json', { ids : newOrder } ).done( function( data ) {

  var positions = Mustache.render( template, data );

  $( "#position" ).html( positions );

} );

小胡子模板:

{{#positions}}

<tr id='{{activity.id}}'>
  <td>{{activity.position}}</td>
  <td>{{activity.url}}</td>
  <td>{{activity.name}}</td>
  <td>{{activity.estimated}}</td>
  <td>{{activity.used}}</td>
  <td>{{activity.created_at}}</td>
</tr>

{{/positions}}

【讨论】:

  • 我想使用 _activities.html.erb 生成新的 html。这个命令正在清理表格元素,但没有填充 Json 响应。我可以不使用 Mustache 吗?
  • 如果你在服务器上生成 HTML,那么你可以发送一个 HTML 响应,你不需要 JSON。试试我的第一个 sn-p 代码,它使用 $.get( '/save_positions' ...,而不是代码中的 $.getJSON('/save_positions.json' ...。使用 Chrome 开发者工具/Firebug/something 来查看响应中的确切内容,并确保它是您所期望的 HTML。
  • 谢谢JMM!!!!!!我使用了第一个选项(HTML 服务器端).. 但我将 '$( "#position" ).html( $( data ).html() );' 更改为 '$( "#position" ).html( data);'
  • 好吧,我不确定你返回的究竟是什么 HTML - 你确定这不是在 tbody 中给你一个 tbody,例如&lt;tbody&gt;&lt;tbody&gt;&lt;tr&gt;...? (您可以使用 Chrome 开发工具或 Firebug 对其进行检查。)
  • 它只返回 &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;... 而没有
猜你喜欢
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多