【问题标题】:Ruby on Rails Rendering tables with dynamic content and partialsRuby on Rails 使用动态内容和部分渲染表
【发布时间】:2011-01-26 05:36:41
【问题描述】:

我已经多次使用这个网站来找到我的答案,但不幸的是我现在卡住了,需要一些帮助。在我的主要内容页面上,我正在处理使用 CSS 和 div id 创建表格的问题。

概述

该表由 2 行 6 列组成,然后分成 12 个框,每个框 200 像素 X 200 像素。现在每个盒子的内容都包含一个新项目(@books),它是从一个单独的控制器(使用内置的生成脚手架命令)生成的。我还使用分页来限制页面 (12) 上的项目,因此较旧的项目只会向后滚动。

问题

通过在我的控制器和视图上使用以下代码,我可以用新内容填充 12 个框中的每一个

控制器

def content
@books= Book.paginate(:page => params[:page], :per_page => 12)
respond_to do |format|
  format.html # content.html.erb
end

查看{content.html.erb}

<% @books.each do |book| %>
  <div id="column1">
      <tr>
        <td><%= book.name %></td>
        <td><%= book.title %></td>
        <td><%= book.content %></td>
        <td><%= link_to 'Show', book %></td>
     </tr>
  </div>
    <% end %>
<br />
<div id="paginate">
    <%= will_paginate(@books, 
) %)
</div>
</div>

当我生成视图时发生的事情是一切都完美呈现,但我所有的书都使用相同的“第 1 列”

     <div id="column1">
      <tr>
        <td>Title</td>
        <td>Name</td>
        <td>Content</td>

        <td><a href="/books/4d376fc63060da4abc000002">Show</a></td>
     </tr>
  </div>
  <div id="column1">
      <tr>
        <td>Title </td>
        <td>Name</td>
        <td>Content</td>

        <td><a href="/books/4d3c96383060da31c9000001">Show</a></td>
     </tr>
  </div>

我希望每本书都有自己的列 {2, 3,4,...12},所以如果我需要使用 jquery,我可以单独定位每一本书。另一个问题是我想对其中的所有内容使用渲染部分,但是当我使用渲染部分时,它将所有项目放在 1 列中 {重新列出 Book.all },所以它只是重复所有包含的信息。我有一种感觉,我想使用另一种方法或编辑当前的方法来完成此操作,但我不确定会发生什么。谢谢!

绿色

更新

嘿,迈克,我非常感谢您努力向新手解释发生了什么。我基本上回到了第一步,应用了每段代码,看看它在哪里疯狂。您在解释问题方面做得很好,但我无法理解渲染代码时发生了什么,因为用于渲染和布局的 ruby​​ 文档非常基本,并且没有任何示例可以让我看到 div_for 标签如何影响渲染过程(我是一个视觉的人)。我想向您展示新代码,但 cmets 不允许,所以我打开了一个答案:(

第一次修改是删除

<% @books.each do |book| %> 

并替换为

<table> 
   render @books
</table>

所以现在我的代码看起来像这样 {content.html.erb}

<div id="maincontent">

    <table>
    render @books
    </table>
    <div id ="column1">
        <tr>
            <td><%= book.name %></td>
            <td><%= book.title %></td>
            <td><%= book.content %></td>
            <td><%= link_to 'Show', book %></td>
        </tr>

    </div>  
    <% end %>
    <br />

    <div id="paginate">

    <%= will_paginate(@books, 
    ) %>
    </div>
</div>

应用此选项后,在呈现指向我的代码最后一行的视图时,我收到了意外的结束错误。(将结束标记添加到末尾时,它只是引发了另一个错误)所以我然后从 _bookcontent 更改了呈现页面.html.erb 到 _book.erb 并在 column1 div 之间插入部分,如图所示。

    <div id ="column1">

        <%= render :partial => "book" %>

    </div>  

我明白这个标签现在在做什么,它告诉我的部分,对于每本“书”,都从数据库中呈现最新的书 id。所以现在 render @books 语句正在跟踪我插入的每个渲染页面的书籍 ID。 (我可能弄错了,但这就是我的看法)。所以现在进入臭名昭著的 此页面在此处呈现的 _book.erb 是我的代码。

<% div_for(book) do %>
<tr>
    <td><%= book.name %></td>
    <td><%= book.title %></td>
    <td><%= book.content %></td>
    <td><%= link_to 'Show', book %></td>
</tr>
<% end %>

从我对 的阅读来看,每本书都包含一个唯一的 div id,例如

 <div id="book_123"> Book.name / Book.Title </div>

这个 div 现在包含在我之前的 column1 div ID 中,其中包含我的列/框的所有样式。由于缺少关于 div_for 标记的信息,我仍然在代码中遇到错误和意外结束。 (尝试用 ruby​​ -w 调试 _book.erb 不起作用,所以我不知道如何使用结束标签)。这些是我试图纠正我的理智的要点。

  1. 我是否应该从内容页面中删除 &lt;div id="column1"&gt; 并在内容页面的其他位置应用新的 div id/类?

  2. 在分页前的部分和 content.html.erb 中,我应该在哪里插入一个 标签?似乎当我同时拥有两个渲染器时,都会抱怨每页末尾的意外结束。

  3. 当用您的代码代替我的代码时,我收到了上述意外结果,但这并不是因为您在我的代码中肯定遗漏了一个组件。

  4. 首先,从布局的角度来看,我可能会以错误的方式处理此问题,但我的主要目标是有 2 行,每列 6 个框/列,每个框包含不同的书。然后使用分页滚动回较早的书籍并应用现在可以正常使用的相同布局,但我为每本书使用相同的列 ID,并且需要分别定位所有框。

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    如果我理解正确,这只是按照你说的做的,而不是你的意思。

    任何具有内容方法的控制器都应该如下所示:

    def content
      @books = Book.paginate :page => params[:page], :per_page => 50
    end
    

    您的视图应该如下所示(旧语法,但仍然可以正常工作)。

    content.html.erb:

    <div id="maincontent">
      <table>
        <%= render :partial => 'book', :collection => @books %>
      </table>
      <br />
      <%= will_paginate @books %>
    </div>
    

    或者试试新的语法。新语法很奇怪,我没有亲自尝试过,但我认为这应该可行。所以这里是替代的,更多 Rails 3 版本的 content.html.erb:

    <div id="maincontent">
      <table>
        <%= render @books %>
      </table>
      <br />
      <%= will_paginate @books %>
    </div>
    

    我认为它根据类名以及是否可枚举来选择部分。

    _book.html.erb 部分:

    <%= div_for(book) do %>
    <tr>
        <td><%= book.name %></td>
        <td><%= book.title %></td>
        <td><%= book.content %></td>
        <td><%= link_to 'Show', video %></td>
     </tr>
    <% end %>
    

    Div_for 是秘诀。

    唯一需要的一端是partial内的一端,用于关闭我们在div_for之后调用do时打开的块。

    【讨论】:

    • 我修复了代码。我忘记了 div_for 语句末尾的“do”。请注意,我在视图中有 table 标记,并且 div 和 tr 标记将在部分中创建。
    【解决方案2】:
    Now i am getting unexpected end errors when i render the page here is my view
    
    view = content.html.erb
    
        <div id="maincontent">
    
        render @books
          <div id="column1">
            <tr>
                <%= render :partial => "bookcontent" %>
            </tr>
          </div>
            <% end %>
        <br />
          <div id="paginate">
            <%= will_paginate(@books, 
            ) %>
          </div>
        </div>
    
    Here is my render partial = _bookcontent.html.erb
       <% div_for(book) %>
    <tr>
        <h3><%= book.name %></h3>
        <h3><%= book.title %></h3>
        <h3><%= book.content %></h3>
        <h3><%= link_to 'Show', book %></h3>
    </tr>
    <% end %>
    

    我也不知道是否应该使用 div id 或类。默认情况下,我总是只使用一个 id。

    【讨论】:

    • Rails 著名的“约定优于配置”的一部分是名称非常重要。部分的名称将用作内部变量的名称。 _book 表示将在部分内部创建一个局部变量“book”。您命名了部分 _bookcontent,但使用了变量“book”而不创建它。与此同时,Rails 根据您使用的名称创建了一个 var _bookcontent。请记住,您正在传递书籍(模型)的集合,并且每本书的部分内容将呈现一次。
    • 而且仅供参考,通常您会使用其他详细信息编辑原始问题,或者只是在 cmets 中为这些东西来回切换,而不是为您自己的问题添加另一个答案。他们真的应该让你把代码放在 cmets 中。
    • 在第 1 列 div 关闭后,您可能会有一个孤立的“结束”。
    • 感谢 cmets Mike 和 Josh 我更新了我的问题以反映这些变化。
    • 已更新。试试看,让我知道会发生什么。显然,我使用 HAML 的时间已经够长了,以至于我忘记了 ERB 是如何工作的。 :(
    【解决方案3】:

    如果我理解正确,您的代码运行良好,但您希望拥有:

    column1
    column2
    column3
    ...
    

    每本书。如果是这样,你为什么不简单地替换:

     <div id="column1">
    

     <div id="column#{@book.id}">
    

    或使用计数器

    <%
     book_counter=0
     @books.each do |book| 
     book_counter = book_counter+1
    %>
      <div id="column#{book_counter.to_s}">
    

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多