2011-01-26 66 views
2

我已经使用这个站点大量的时间来找到我的答案,但我很抱歉现在需要一些帮助。在我的主要内容页面上,我正在研究使用CSS和div ID创建表格的问题。Ruby on Rails使用动态内容和局部视图渲染表格

概述

表被损害的2行和6列,然后蔓延到12个箱每箱200像素X 200像素哪个。现在每个框的内容都包含一个新的项目(@books),它是由一个单独的控制器生成的(使用内置的生成scaffold命令)。我还使用分页来限制页面上的项目(12),以便旧的项目能够回滚。

问题

我能够用我的控制器和视图

控制器

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

查看{content.html以下代码来填充每个新内容12盒。 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。另一个问题是,我想使用渲染partial来处理所有内容,但是当我使用渲染partial时,它将所有项放置在1列{rel.Book.all}中,因此它只是重复所有包含的信息。我有一种感觉,我假设使用另一种方法或编辑当前的方法来完成这一点,但我不确定发生了什么。谢谢!

greenz

更新

嘿麦克我真的很感激你在想什么事情解释给一个牛逼的努力。我基本上回到第一步,应用每一段代码,看看它在哪里发疯。你正在做一个很好的工作来解释这个问题,但我无法理解渲染代码时发生了什么,因为用于渲染和布局的ruby文档非常基本,并且没有任何示例,我可以看到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> 

当这个应用我收到意想不到的è nd错误,当渲染视图指向我的代码的最后一行(当添加结束标记到最后它只是抛出另一个错误)所以我然后改变渲染页面从_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_for(书)上阅读做%>披着每本书的唯一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 /类?

  2. 在我的分页之前,我在哪里插入<%end%>在partial和content.html.erb中标记了一个?看起来好像当我有两个渲染器抱怨在每个页面结尾的意外结束。

  3. 当用你的代码代替地雷时,我收到了上述意外的结果,但这不是由于你在我的代码中肯定缺少一个组件。

  4. 我可能会从布局上感知错误的方式接近这个错误的方式,但我的主要目标是有2行6个框/列,每个框包含一本不同的书。然后使用分页回滚到早期的书籍,并应用相同的布局,现在它确实很好,但是我为每本书使用相同的列ID,并且需要单独定位所有框。

回答

2

如果我正确地理解了你,这只是它做你所说的事情,而不是你的意思。

无论控制器具有内容的方法应该是这样的:

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> 

我认为它选择基于类名的部分,以及是否可枚举。

The_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是秘密的酱油。

唯一需要的是在div_for之后调用do时打开的块关闭部分。

+0

我固定的代码。我在div_for语句结尾忘记了“do”。请注意,我在视图中有表格标签,div和tr标签将在部分中创建。 – mikewilliamson 2011-01-26 13:06:00

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或class。默认情况下,我总是只使用一个ID。每本书

column1 
column2 
column3 
... 

+0

Rails着名的“convention over configuration”的一部分是名称非常重要。部分的名称将被用作内部变量的名称。 _book意味着局部变量将创建一个局部变量“book”。您将部分_bookcontent命名,但使用变量“book”而不创建它。与此同时,Rails根据您使用的名称创建了一个var _bookcontent。请记住,您传递的是书籍(模型)集合,并且每个书籍的部分内容都会呈现一次。 – mikewilliamson 2011-01-26 12:53:49

-1

如果我理解正确的,你的代码工作正常,但你想拥有。如果是这样的话,你为什么不干脆更换:

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