【问题标题】:Rails: Rendering Partials through AjaxRails:通过 Ajax 渲染局部
【发布时间】:2012-03-02 04:20:33
【问题描述】:

我有一个带有标签的页面,我想在点击标签时通过 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

【问题讨论】:

  • “我有一些代码,但我认为这不是最有效的方法”。上面的代码工作正常吗?你想优化这个过程还是首先想要一个工作代码?
  • @prasvin 该代码无法正常工作,正试图通过我之前在互联网上找到的东西使其工作,但我不确定如何让它运行,或者它是否是最有效的方式。如果有更好的方法,我会全力以赴学习:)

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


【解决方案1】:

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

您可以做的是在动作中渲染一个 json 并将部分作为 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)

【讨论】:

  • 我非常感谢 :)
  • 如果上述方法不起作用,或者您不确定某些事情,请回信。代码未经测试,但应该能让您接近完成任务。
  • 我以前从未使用过 json 但我使用图像而不是 js 文件创建了一个 json 文件并将其添加到其中?
  • 不,您不需要创建 js 视图(我猜这就是您所指的 js 文件,比如 foo.js.erb)。这就是渲染 json 的重点。您需要做的就是在您的 javascript/coffeescript 文件中捕获呈现的 json,然后您就完成了(我的回答是“您可以在 js 中访问 json”,即您的 javascript 文件说 mostrecent.js)。没有 js 视图。我建议你去alfajango.com/blog/rails-3-remote-links-and-forms,因为那是我大约 8 个月前读到的。
  • 我有一个 mostrecent.js 文件,但它在学校文件下,也可以删除该文件中的所有内容并将您的 json 代码添加到其中吗?
【解决方案2】:

Prasvin 的回答很准确。返回和执行 JS 可能看起来很简单,但它让调试变得更加麻烦——如何在通过 AJAX 返回的 JS 中设置断点?相反,您应该在页面中包含所有 JS,并且只发送数据。

【讨论】:

    【解决方案3】:

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

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

    我会收到一个错误“缺少模板...仪器...”

    经过一番阅读,我发现了这条评论rails render_to_string giving errors with partial view。 @marcel提到你需要指定文件是partial,partial:'instruments',如下:

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

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2015-12-16
      相关资源
      最近更新 更多