Rails:通过Ajax渲染部分

时间:2012-03-02 04:20:33

标签: ruby-on-rails ajax ruby-on-rails-3 jquery

我有一个带标签的页面,我想在单击标签时通过ajax呈现不同的部分。我有一些代码,但我认为这不是最有效的方法。我希望是否有人可以帮助我使用已经存在的代码,或者如果有更简单的方法我会非常感激。谢谢!

HTML标签

<li class='StreamTab StreamTabRecent active'>
<%= link_to 'Most Recent', mostrecent_schools_path, :remote => true, :class => 'TabText' %>
</li>


<div id='ContentBody'>
<div id='ajax'></div>
<%= render 'users/microposts', :microposts => @microposts %>
</div>

学校管理员

class SchoolsController < ApplicationController  
  def mostrecent
    @school = School.find_by_slug(request.url.gsub('http://localhost:3000/','')).id
    @microposts = @user.microposts.order('created_at DESC').paginate(:per_page => 3, :page => params[:page])
     respond_to do |format|
      format.html
      format.js
     end
  end
end

最新的JS

$("#ContentBody").html('<%= escape_javascript(render :partial => "users/microposts" )%>');

路线

  resources :schools do
    collection do
        get :mostrecent
    end
  end

3 个答案:

答案 0 :(得分:10)

请参阅上一篇文章的回答。这会给你一个想法AJAX in Rails: Show model#new form after completing a model#update

你可以做的是在动作中渲染一个json并将partial传递给json。

def mostrecent
  @school = School.find_by_slug(request.url.gsub('http://localhost:3000/','')).id
  @microposts = @user.microposts.order('created_at DESC').paginate(:per_page => 3, :page => params[:page])
  respond_to do |format|
    format.json { render :json => {:success => true, :html => (render_to_string 'users/microposts')} }
    format.html { }
  end
end

您可以访问js中的json(即javascript / coffeescript文件,例如mostrecent.js或mostrecent.js.coffee)并替换当前元素。

$('.TabText').live 'ajax:success', (event,data) ->
  $('#ContentBody').html(data.html) if(data.success == true)

答案 1 :(得分:2)

Prasvin的答案是现场的。返回和执行JS可能看起来很简单,但它使调试变得更加糟糕 - 如何在JS中设置通过AJAX返回的断点?相反,您应该在页面中包含所有JS并仅返回数据。

答案 2 :(得分:0)

我使用rails 4.2和@prasvin回答指出了我正确的方向,但是当我使用时

format.json { render :json => {:success => true, :html => (render_to_string 'instruments')} }

我会收到错误&#34;缺少模板......工具......&#34;

经过一番阅读后,我发现了这条评论rails render_to_string giving errors with partial view。 @marcel提到你需要指定文件是部分,部分:&#39;乐器&#39;,如下所示:

format.json { render :json => {:success => true, :html => (render_to_string partial: 'instruments')} }