【问题标题】:Nicest way to render different partials on a rails object?在 rails 对象上渲染不同部分的最佳方法?
【发布时间】:2016-09-11 20:12:54
【问题描述】:

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

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

有什么建议吗? 谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      <%= render video, list: true %>
      
      
      _video.html.erb
      
      <% if local_assigns[:list] %>
      #list view
      <% elsif local_assigns[:select] %>
      #select view
      <% else %>
      #default view
      <% end %>
      

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

      谢谢

      【讨论】:

      • 我建议不要这样做。这种局部性很快就会成为维护的噩梦。
      • @tompave 那么你建议用什么来代替 if elsif else?
      • 如果您想这样做并且视图变得复杂,您可以创建专门的视图文件,例如 _video_list.html.erb_video_select.html.erb_video_default.html.erb,并仅将 _video.html.erb 用于 if-elsif -elsif 使用显式的render partial: '...' 调用检查和呈现专用文件。从概念上讲,这将是与@shmargum 的答案相同的解决方案,但条件是从to_partial_path 拉出到视图中。
      【解决方案3】:

      如果要渲染一组视频,可以使用

      <%= render videos %>
      

      而不是

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

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

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

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

      【讨论】:

        【解决方案4】:

        现在我只是调用方法
        &lt;%= render 'videos/video_list' locals: video %&gt;

        这应该行不通。

        可以是:
        &lt;%= render 'videos/video_list', video: video %&gt;
        或:
        &lt;%= render partial: 'videos/video_list', locals: { video: video } %&gt;

        任何一个都绝对比任何“聪明”的自动魔术助手更正确、明确、简单和有弹性。

        【讨论】:

          猜你喜欢
          • 2018-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-17
          • 1970-01-01
          • 2018-10-16
          相关资源
          最近更新 更多