在 rails 对象上呈现不同部分的最佳方式?

Nicest way to render different partials on a rails object?

我有一个以不同方式显示的视频列表。 如果我只是以一种方式显示它,我会简单地写

<% videos.each do |video| %>
<%= render video %>
<% end %>

这加载了我的 _video.html.erb 部分,但有时我想加载不同的部分,这取决于我的观点。

根据列出的页面呈现多个视图最"Rails way"的是什么?

所以在我的主页上我可以呈现 _video.html.erb,但在另一个页面上我可以呈现 _video_list.html.erb。现在我只是调用方法

<%= render 'videos/video_list' locals: video %>

但我觉得有更好的方法?感觉要是能写就好了

<%= render video, 'list' %>

有什么建议吗? 谢谢

经过一番挖掘,看起来这是最好的方法

<%= render video, list: true %>


_video.html.erb

<% if local_assigns[:list] %>
#list view
<% elsif local_assigns[:select] %>
#select view
<% else %>
#default view
<% end %>

这其实感觉还不错。如果没有人提出可能更好的建议,我会在几天内将其标记为正确吗?

谢谢

如果要渲染视频集合,可以使用

<%= render videos %>

而不是

<% videos.each do |video| %>
  <%= render video %>
<% end %>

要渲染 views/videos 中另一个文件的不同部分 views/videos/_list.html.erb,您可以这样做:

<%= render 'list', video: @video %>

末尾的散列参数使实例变量 @videolist 部分可用,是一个名为 video 的局部变量。从技术上讲,您可以直接访问 list 部分中的 @videos,但如果您显式传入新变量,则更容易跟踪事情。

要让同一模型根据某些条件渲染不同的模板,您可以在任何对象上实现 to_partial_path 方法并在该对象上调用渲染:

def to_partial_path
  if list?
    "videos/list"
  else
    "videos"
  end
end

Right now I'm just calling the method
<%= render 'videos/video_list' locals: video %>

那应该行不通。

它是:
<%= render 'videos/video_list', video: video %>
或者:
<%= render partial: 'videos/video_list', locals: { video: video } %>

绝对比任何 "clever" 自动魔术助手都更正确、明确、简单和有弹性。