【问题标题】:Pre-render AJAX-populated view in a DRY way以 DRY 方式预渲染 AJAX 填充的视图
【发布时间】:2012-05-12 17:11:59
【问题描述】:

我们应用程序中的许多 Rails 视图通过 AJAX 填充它们自己,并且它们的数据的第一次呈现来自在 jquery 的 $(document.ready) 事件上运行的 javascript 调用。我们对此感兴趣的视图本质上显示了一个表格数据列表(例如收件箱、搜索结果列表等)。

我们希望在不进行 AJAX 调用的情况下预渲染结果的第一页,但我们希望能够在不重新加载整个页面的情况下重新填充视图。这并不难,但似乎需要在应用程序的不同部分编写单独的代码来执行相同的操作:一次在视图中绘制初始数据集(来自最初的render 调用),一次更多在 Javascript 中绘制新的数据集(动态清除旧的 DOM 并用新的 HTML 替换它)。

目前,javascript 会克隆一个隐藏的(带有style='display: none')模板元素(通常是div),设置每个字段的值,并将新元素添加到 DOM。这很好用,但是如果我们想在渲染之前预先填充视图,我们必须在 ruby​​fied ERB 块中编写模板对象的另一个副本(例如@messages.each do |m|)。如果模板更改,则 ERB 块中的代码必须更改以匹配 -- not very DRY

有没有更好的方法?如果有,是什么?

谢谢

汤姆

【问题讨论】:

    标签: javascript ajax ruby-on-rails-3 dry


    【解决方案1】:

    在您的文档(准备好)中,您可以明确地进行第一个不绑定到事件处理程序的 AJAX 调用。或者类似地,您可以显式触发事件处理程序。

    未初始化的索引视图:

    index.html.haml(初始)

    .span12
      #book-table
    

    现在这里是用于填充 div#book-table 的 DRYed 部分

    _table.html.haml

    %table
      %tr
        %th Title
        %th Author
      - books.each do |book|
        %tr
          %td= link_to book.title, book_path(book)
          %td= book.author
    

    接下来,您将拥有响应它的 JS。请注意,这样做是在 AJAX 调用索引操作期间呈现部分。

    index.js.erb

    $('#book-table').html('<%= escape_javascript(render(partial: "table", locals: { books: @books })) %>');
    

    我们现在需要调整索引视图来初始化这个视图:

    index.html.haml(最终)

    :javascript
      $(document).ready (function() {
        $.get("/books.js");
      });
    
    .span12
      #book-table
    

    如您所见,document.ready 执行初始 AJAX 调用,点击您的 .js.erb 并填充 div 而不显式填充 .html.haml 中的 div

    【讨论】:

    • 很抱歉,但这不是我的问题。我正在寻找导致初始请求返回带有预填充数据的 html 的答案,使用 javascript 使用的相同模板。
    • 有一个共享的部分,然后,初始请求和 AJAX 调用都使用。 $('#mydiv').html('&lt;%= escape_javascript(render :mypartial, locals: { foo: @myvar } ) %&gt;');您的初始调用可以将部分呈现为视图的一部分,然后您的 AJAX 调用可以呈现类似于上面的 .js.erb 的内容来更新它。
    • 完成。我假设您已经让 AJAX 与您的控制器一起使用,所以我省略了它,以及未就绪的 AJAX 触发事件。
    猜你喜欢
    • 2019-10-14
    • 2011-07-06
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2011-07-21
    相关资源
    最近更新 更多