Reputation: 13835
I have a loop like such:
<% @posts.each do |post| %>
<% render middle %>
<% end %>
Then in my middle partial, how do I access the current post?
Upvotes: 141
Views: 84011
Reputation: 2160
You can replace the entire each block with this:
<%= render partial: "product", collection: @posts %>
Or even shorter:
<%= render @posts %>
Full documentation (section 3.2) https://guides.rubyonrails.org/action_view_overview.html
Upvotes: 0
Reputation: 25029
Replace <%= render middle %>
with <%= render middle, :post => post %>
. Then in your middle
partial, you can access the post
variable.
Upvotes: 10
Reputation: 3705
Give it to the partial as a local variable
<%= render :partial => 'middle', :locals => { :post => post } %>
Of course, rails also has a shortcut for rendering collections:
<%= render :partial => 'post', :collection => @posts %>
In this case it will call the partial post for every post with a local variable 'post'
You can even render a spacer template between each post:
<%= render :partial => 'post', :collection => @posts, :spacer_template => 'post_divider' %>
Upvotes: 124
Reputation: 17734
Try this:
<% @posts.each do |post| %>
<%= render 'middle', :post => post %>
<% end %>
Like this you'll have a local variable post
available within the partial.
Upvotes: 236
Reputation: 1391
<% @posts.each do |post| %>
<% render middle, :post => post %>
<% end %>
You can now access post as the local variable post
in the partial
Upvotes: 14