在rails对象上渲染不同部分的最好方法是什么?

时间:2016-09-11 20:12:55

标签: ruby-on-rails ruby-on-rails-4.2

我有一系列视频,我以不同的方式展示。 如果我只是以一种方式显示它,我只想写

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

这会加载我的_video.html.erb部分,但有时我会根据我的视图加载不同的部分。

根据列出的页面,有多个视图呈现的“Rails方式”是什么?

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

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

但我觉得有更好的方式吗?我觉得如果我能写的话会很棒。

<%= render video, 'list' %>

有什么建议吗? 感谢

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

<%= render video, list: true %>


_video.html.erb

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

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

由于

答案 2 :(得分:0)

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

<%= render videos %>

而不是

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

要从views/videos/_list.html.erb中的其他文件呈现不同的部分views/videos,您可以这样做:

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

最后的哈希参数使@video partial中的实例变量list可用,是一个名为video的局部变量。您可以从技术上直接访问@videos部分中的list,但如果您明确传入新变量,则更容易跟踪事物。

答案 3 :(得分:0)

  

现在我只是调用方法
  <%= render 'videos/video_list' locals: video %>

那不应该工作。

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

要么肯定比任何&#34;聪明的&#34;更加正确,明确,简单和有弹性。自动助手。