如何在 Rails 中对常用视图代码进行分组和干燥

Posted

技术标签:

【中文标题】如何在 Rails 中对常用视图代码进行分组和干燥【英文标题】:How to group and dry common view code in Rails 【发布时间】:2015-08-28 05:33:45 【问题描述】:

我有两个模型 EpisodePlaylist 有以下两个视图:

剧集

<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>

这两种观点的共同点是

<div class="name">. <div class="description"> 

但是这两个 divss 的内容对于每个视图是不同的。

问题:如何将这两个常见的 div 提取到另一个视图中,称为 _section?

我尝试了什么:

    Cells -> 它们为我提供了一个带有属性的漂亮视图模型,但我找不到在放置属性的位置之间添加额外 html 元素的方法。

    Yield 和 Content_for-> 我尝试创建一个单独的 _section 布局:

_section.html.erb

<div class="name">
    <%= yield :name %>
</div>

<div class="description">
    <%= yield :description %>
</div>

然后是两个视图。 Episode 视图将呈现以下内容

<% 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。

【问题讨论】:

【参考方案1】:

我最终将播放列表和剧集视图的所有逻辑移动到一个视图中 - 称为部分,基本上执行以下操作:

<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>

哇,那些“如果”真难看。我不确定我是否正确理解了这个问题,但令人惊讶的是我找不到更干净的解决方案。

【讨论】:

以上是关于如何在 Rails 中对常用视图代码进行分组和干燥的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Odoo 8 的 fom 视图中对树/列表视图进行分组?

是否可以在 ruby​​ on rails 中对关联进行分组?

使用嵌套资源干燥 Rails 视图

如何在 ASP.NET MVC 视图中对数据进行分组?

在 Rails 中显示/隐藏部分/模板的更干燥的方式

如何在 StarUML 中对箭头进行分组/概括?