在Rails 5中渲染循环内部分

问题:如何使部分(必须是通用的)循环遍历不同的变量?

我有一个标签页,我想使用partial来避免重复我的HTML。 标签是“video”和“文章”。 这是完全相同的HTML,但我想通过video和@articles迭代文章。

我的想法是让产品部分完全通用,然后以某种方式传递我想迭代的@videos或@articles。

部分:_product.html.slim

.col-md-5 .thumbnail .thumb.spacer-sm - if product.image.blank? iframe allowfullscreen="" frameborder="0" mozallowfullscreen="" src="https://player.vimeo.com/product/#{product.vimeo_id}" webkitallowfullscreen="" - elsif product.vimeo_id.blank? = image_tag(product.image.url, class: 'img img-responsive img-rounded') .caption .content-group-sm.media .media-body h6.text-semibold.no-margin = product.name small.text-muted | by  = product.user.name - unless product.price.blank? h6.text-success.media-right.no-margin-bottom.text-semibold | $ = product.price = product.description .panel-footer.panel-footer-transparent .heading-elements ul.list-inline.list-inline-separate.heading-text li = link_to 'Delete', product_path(product), method: :delete li = link_to 'Edit', edit_product_path(product) 

HTML视图呈现部分:

  .page-container.spacer-minus .page-content .row .col-md-4 .sidebar-default.sidebar-separate .sidebar-content .content-group .panel.no-border-radius-top ul.navigation li.navigation-header Navigation li.active a data-toggle="tab" href="#videos" i.icon-video-camera2 | Videos li a data-toggle="tab" href="#articles" i.icon-graduation | Articles .col-md-8 .tab-content #videos.tab-pane.fade.in.active .row - @videos.each do |product| = render 'shared/product' #articles.tab-pane.fade .row - @articles.each do |product| = render 'shared/product' 

我只需要我的循环来理解我想要迭代的变量。 我不能在部分中包含@ video或@article,因为这会破坏通用部分的目的。

通过这个实现,我得到错误: undefined local variable or method `product' for #<#:0x007fc58884ea68>

试试这段代码:

 #videos.tab-pane.fade.in.active .row - @videos.each do |video| = render 'shared/product', product: video #articles.tab-pane.fade .row - @articles.each do |article| = render 'shared/product', product: article 

嗨这是很好的东西,如果你想在video之后的文章,然后尝试这个。

 = render partial: "product", collection: @videos = render partial: "product", collection: @articles 

这将从您的主视图中删除循环,但在您的情况下,您不使用本地尝试此操作

  .row - @videos.each do |video| = render 'shared/product', locals: {product: video} .row - @articles.each do |article| = render 'shared/product' , locals: {product: article} 

它会工作。