我有两个模型 Episode 和 Playlist 具有以下两个 View :
对于剧集:
<div class="name">
<%= link_to episode.name, episode_path(episode) %>
</div>
<div class="description">
<%= link_to episode.description episode_path(episode) %>
</div>
对于播放列表:
<div class="name">
<%= link_to playlist.name, playlist_path(playlist) %>
</div>
<div class="description">
<span>Some special span</span>
<%= raw(playlist.description) %>
</div>
这两个 View 之间的共同点是
<div class="name">. <div class="description">
但是这两个divs的内容对于每个view都是不同的。
问题:如何将这两个公共(public) div 提取到另一个名为 _section 的 View 中?
我尝试了什么:
单元格 -> 它们为我提供了一个带有属性的漂亮 View 模型,但我找不到在放置属性的位置之间添加额外 HTML 元素的方法。
Yield 和 Content_for-> 我尝试创建一个单独的 _section 布局:
_section.html.erb
<div class="name">
<%= yield :name %>
</div>
<div class="description">
<%= yield :description %>
</div>
然后是两个 View 。 Episode View 将呈现以下内容
<% render layout: "section" do %>
<% content_for :name do %>
<%= link_to episode.name, episode_path(episode) %>
<% end %>
<% content_for :description do %>
<%= link_to episode.description episode_path(episode) %>
<% end %>
<% end %>
这种工作直到你开始缓存(他们说 content_for 不适用于缓存,我需要缓存它)我遇到的另一个问题是你应该包含一个额外的空未命名的 yield。
最佳答案
我最终将播放列表和剧集 View 的所有逻辑移动到一个 View 中 - 称为基本上执行以下操作的部分:
<div class="name">
<%= link_to object.name, polymorphic_path(object) %>
</div>
<div class="description">
<% if is_episode? %>
<h1>Some special h1 for episode</h1>
<% elsif is_playlist? %>
<h2>Some special other html for playlist for episode</h2>
<% end %>
<%= raw(playlist.description) %>
</div>
哇,那些“如果”真丑。我不确定我是否正确理解了问题,但令人惊讶的是我找不到更清晰的解决方案。
关于ruby-on-rails - 如何在Rails中对公共(public) View 代码进行分组和干燥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32263966/