Ruby on Rails使用动态内容和部分渲染表

时间:2011-01-26 05:36:41

标签: ruby-on-rails-3

我已经多次使用这个网站找到我的答案,但我很遗憾现在被困住了,需要一些帮助。在我的主要内容页面上,我正在努力解决使用CSS和div ID创建表的问题。

概述

该表受到2行6列的影响,然后溢出到12个盒子中,每个盒子200px X 200px。现在每个框的内容包含一个新项(@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},这样它就会重复所有包含的信息。我有一种感觉,我想要使用另一种方法或编辑当前的方法来完成这个,但我不确定是什么。谢谢!

greenz

更新

嘿迈克,我真的很感谢你努力解释新的事情。我基本上回到第一步,应用每一段代码,看看它在哪里疯狂。你正在做一个很好的工作来解释这个问题但是我无法理解在渲染代码时会发生什么,因为渲染和布局的ruby doc非常基础,没有任何例子我可以看到div_for标签如何影响渲染过程(我是个视觉人士。我想向您展示新代码,但评论不允许,所以我打开了答案:(

第一次编辑是删除

<% @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>  

&lt;%end%&gt;

我理解这个标签现在正在做什么告诉我的部分,因为每个“书”都会从数据库中呈现最新的书籍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 %>

从我对&lt;%div_for(book)do%&gt;的阅读中读到正在为每本书包装一个唯一的div id,例如

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

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

  1. 我应该从我的内容页面中删除<div id="column1">并在我的内容页面上的其他位置应用新的div id / class吗?

  2. 我在哪里插入&lt;%end%&gt;在我的分页之前在partial和我的content.html.erb中标记一个?好像当我有两个渲染器抱怨每页末尾的意外结束时。

  3. 当用你的代码代替地雷时,我会收到上面意想不到的结果,但这不是因为你在我的代码中肯定错过了一个组件。

  4. 我可能从一开始就认真对待这个错误的方式,但我的主要目标是拥有2行6个盒子/列,每个盒子包含不同的书。然后使用分页滚动回到早期的书籍并应用相同的布局,它现在很好,但我使用相同的列ID为每本书,并需要单独定位所有框。

3 个答案:

答案 0 :(得分:3)

如果我理解正确的话,这只是表达你说的话,不是你的意思。

无论控制器是什么,内容方法都应如下所示:

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>

我认为它根据类名选择partial,以及它是否可枚举。

_book.html.erb partial:

<%= 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是秘诀。

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

答案 1 :(得分:0)

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。

答案 2 :(得分:-1)

如果我理解正确,您的代码工作正常,但您希望:

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}">