2016-05-22 33 views
0

Ich stoße hier auf ein seltsames Problem. Ich fahre Rails 4.2.1 & Ich benutze das Rails Crash Course Buch von Anthony Lewis und befolge die Anweisungen in diesem Buch. Der Link für die Buchanweisungen lautet found here über Google Bücher.Rails 4.2.1, Verwenden von Auflistungen mit partiellen Ursachen Die angezeigten Elemente werden basierend auf der Anzahl der Elemente wiederholt

So in den Anweisungen, sagt er den folgenden Codeblock in einen Teil namens „_post.html.erb“

<% @posts.each do |post| %> 

<h2><%= link_to post.title, post %></h2> 

<p><i><%= friendly_date post.created_at %></i></p> 

<p><%= post.body %></p> 

<p> 

<%= link_to 'Edit', edit_post_path(post) %> 

<%= link_to 'Destroy', post, method: :delete, 

     data: { confirm: 'Are you sure?' } %> 

</p> 

<% end %> 

Er sagt dann zu bewegen, dass Sie den folgenden Code ausführen können grundsätzlich die teilweise zu aktivieren.

<%= render :partial => 'post', :collection => @posts %> 

// or the simplified version ... 

<%= render @posts %> 

Wenn ich dies tue, werden die auf der Seite angezeigten Elemente jedoch um die Anzahl der Elemente wiederholt. Also in diesem Fall habe ich 3 Gegenstände und sie werden 3 mal wiederholt. I have attached a screenshot.

Wenn jedoch der Code nicht in eine partielle entfernt wird und keine Sammlungen verwendet werden, funktioniert es einwandfrei. Mit anderen Worten, wenn sich der Code in der Datei "index.html.erb" der Ansicht befindet, gibt es keine Wiederholungen der angezeigten Elemente.

Kann mir jemand helfen, was hier vor sich geht? Ich würde das wirklich zu schätzen wissen!

Antwort

0

Für jede post Rails läuft teilweise Code, wo Sie über alle Beiträge iterieren, so erhalten Sie Wiederholungen!

Nehmen Sie die Iteration von Ihrem Teil und Sie sollten in Ordnung sein. Rails weist die lokale Variable post in Ihrem Teil automatisch zu, wenn Sie render mit der Sammlung verwenden.

<h2><%= link_to post.title, post %></h2> 

<p><i><%= friendly_date post.created_at %></i></p> 

<p><%= post.body %></p> 

<p> 

<%= link_to 'Edit', edit_post_path(post) %> 

<%= link_to 'Destroy', post, method: :delete, 

     data: { confirm: 'Are you sure?' } %> 

</p> 
+0

Danke Ich habe das auch versucht, aber es wiederholt immer noch – AliceY

+0

Sie sollten entweder '<% = render: partial => 'post',: collection => @posts%>' oder '<% @ posts.each do | Beitrag | %> ', aber nicht beide –

+0

Entschuldigung, aber können Sie dies näher ausführen. Nur der Block, der mit '<% ​​@ posts.each do | post | %> 'funktioniert in der Datei index.html.erb. Wenn ich '<% = render: partial => 'post' verwenden soll,: collection => @posts%>' wie würde das funktionieren? Danke – AliceY

0
<%= render @posts %> 

wenn Sie dies tun @posts ist bereits eine Sammlung von Beiträgen deshalb brauchen Sie nicht noch einmal zu wiederholen, löschen gerade diesen Teil:

<% @posts.each do |post| %> 

<% end %> 
+0

, das endet, alle Posts zu entfernen, die von der Seite – AliceY

+0

aufgelistet werden, sorry wirklich darüber, versuchte es wieder und es funktioniert dieses Mal – AliceY

0

Nun sieht es aus wie dieses Problem bekam aufgelöst. Ich hatte den Absatz falsch gelesen und wurde mit dem Code zu duplizieren, wie durch @petr und @ marv-c Die richtige Lösung war zu bewegen, um den Code innerhalb des Blockes auf die Teildatei weist darauf hin,

<h2><%= link_to post.title, post %></h2> 

<p><i><%= friendly_date post.created_at %></i></p> 

<p><%= post.body %></p> 

<p> 

<%= link_to 'Edit', edit_post_path(post) %> 

<%= link_to 'Destroy', post, method: :delete, 

    data: { confirm: 'Are you sure?' } %> 

</p> 

dann den Code für den Block entfernen <% @posts.each do |post| %> und <%-# end %> nun für aushelfen kann ich

wieder dank @petr und @ marv-c <%= render @posts %> wo der Block war ursprünglich

in der Sammlung Code hinzuzufügen !!