在 Rails 5 中的循环内渲染部分
Render partials inside loop in Rails 5
问题:如何通过不同的变量进行部分(必须是通用的)循环?
我有一个标签页,我想在其中使用部分内容以避免重复我的 HTML。选项卡是 "Videos" 和 "Articles"。它完全相同 HTML 但我想遍历@videos 的视频和@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 #<#<Class:0x007fc58053ae60>: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
嗨,如果您希望文章在视频之后出现,那么试试这个。
= 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}
它会起作用。
问题:如何通过不同的变量进行部分(必须是通用的)循环?
我有一个标签页,我想在其中使用部分内容以避免重复我的 HTML。选项卡是 "Videos" 和 "Articles"。它完全相同 HTML 但我想遍历@videos 的视频和@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 #<#<Class:0x007fc58053ae60>: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
嗨,如果您希望文章在视频之后出现,那么试试这个。
= 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}
它会起作用。