开发者

Ruby on Rails Rendering tables with dynamic content and partials

开发者 https://www.devze.com 2023-02-06 14:38 出处:网络
I\'ve used this site plenty of times to find my answer but im am unfortunately stuck now and need some help. On my main content page I am working on im running into an issue with creating a tables usi

I've used this site plenty of times to find my answer but im am unfortunately stuck now and need some help. On my main content page I am working on im running into an issue with creating a tables using CSS and div ids.

Overview

The table is compromised of 2 rows and 6 columns and then spilt into 12 boxes which each box 200px X 200px. Now the content of each box contains a new item (@books) which is generated from a separate controller(used the built in generate scaffold command). I am also using pagination to limit the items on the page (12) so older items just roll on back.

Issue

I am able to populate each of the 12 boxes with new content by using the following code on my controller and view

controller

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

view {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>

What happens when I generate the view is that everything is rendering perfectly but all of my books are using the same 'column 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>

I would like for each book to have its own column {2, 3,4,...12} so i can target each individually if i need to using jquery. The other problem is that i would like to use render partial for everything in the but when i use the render partial it places all the items within the 1 column {relisting of Book.all }so it just repeats all the contained information. I have a feeling im suppose to use another method or edit the current one to complete this but I'm unsure what goes were. Thanks!

greenz

Update

Hey Mike i really appreciate your effort in trying to explain to a newby whats going on. I basically went back to step one a applied each piece of code to see where it is going bonkers at. You are doing a wonderful job explaining the issue yet i can't grasp whats going on when rendering the code because the ruby doc's for rendering and layout are pretty basic and dont have any examples where i can see how div_for tag effects the rendering process (I'm a visual person). I wanted to show you the new code but comments don't allow it so i opened an answer :(

The first edit was removing the

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

and replacing with

<table> 
   render @books
</table>

so now my code looks like this {content.html.erb}

<div id="maincontent">

    <table>
    render @boo开发者_如何学运维ks
    </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>

When this is applied i receive an unexpected end error when rendering the view pointing to the last line of my code.(When adding the end tag to the end it just threw another error) So i then changed the render page from _bookcontent.html.erb to _book.erb and inserted the partial between the column1 div as shown.

    <div id ="column1">

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

    </div>  

<% end %>

I understand what this tag is now doing it telling my partial that for every "book" render the latest book id from the database. So now the render @books statement is keeping track of the books id for every render page i insert. (I could be mistaken but this is how i perceive it). So now onto the infamous _book.erb that this page is rendering here is my code.

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

From my reading on the <% div_for(book) do %> is wrapping a unique div id around each book such as

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

This div is now contained inside my column1 div ID from before which has all my styling for my column/boxes. From the lack of information on the div_for tag I am still running into errors and unexpected ends in my code. (Trying to debug the _book.erb with ruby -w doesn't work so i dont know how to use the end tags). These are the take aways i am trying to correct for my sanity.

  1. Should I remove the <div id="column1"> from my content page and apply a new div id / class elsewhere on my content page?

  2. Where do i insert <% end %> tags one in the partial and in my content.html.erb before my pagination? It seems as though when i have both the renderer complains about unexpected ends at the end of each page.

  3. When substituting your code in place of mines i receive the above unexpected end but this isn't due to you im definitely missing a component in my code.

  4. I could be approaching this the wrong way from a layout perceptive in the first place but my main goal is to have 2 rows of 6 boxes/columns w/ each box containing a different book. Then using pagination to scroll back to the earlier books and apply the same layout which it does fine now but i am using the same column id for each book and need to target all the boxes separately.


If I understand you correctly, this is just a case of it doing what you said, not what you meant.

Whatever controller has the content method should look like this:

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

Your view should look like this(old syntax but still should work fine).

content.html.erb:

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

Or try the new syntax. The new syntax is weird and I haven't tried it personally but I think this should work. So here is the alternate, more Rails 3 version of content.html.erb:

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

I think it chooses the partial based on the class name and whether it is enumerable.

The _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 is the secret sauce.

The only end that is required is the one inside the partial to close the block opened when we called do after the div_for.


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

I am also clueless as to if i should be using a div id or class. By default i always use just an id.


If I understand correctly, your code is working fine but you want to have:

column1
column2
column3
...

for each book. If that is the case, why don't you simply replace:

 <div id="column1">

with

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

or use a counter

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号