如何在Rails局部视图中为超类对象编写Rails方式的通用代码?

时间:2012-02-15 23:02:35

标签: ruby-on-rails partial-views

问题

我的应用管理ProjElements,其子类化为:

  • Milestone
  • Task
  • Decision
  • ...... etc

对于给定的ProjElement show.html.erb,您可以对该项目元素实例发表评论(例如,您可以在Milestone XYZDecision ABC上添加评论)。像这样:

// display project element specific stuff
//  - e.g. show.html.erb for Milestone has milestone-specific stuff
//  - e.g. show.html.erb for Decision has decision-specific stuff

// provide comment functionality
//  - e.g. for Milestone's show.html.erb, code looks like

    <%= form_for [@milestone, Comment.new] do |f| %>
      <% if @milestone.comments.size > 0 %>
         ...
      <% end %>
      <% f.submit %>
    <% end %>

提议的方法

  • 我计划对注释代码使用partial,并根据DRY在不同项目元素的各种show.html.erb视图中使用它。但是......

  • 如何编写部分Rails方式的通用代码,以便局部可以处理不同的项目元素?

1 个答案:

答案 0 :(得分:2)

您可以通过locals哈希传递元素的子类实例。在app / views / milestones / show.html.erb

render :partial => 'shared/comments', :locals => { :element => @milestone }

在app / views / shared / _comments.html.erb

<% form_for [element, Comment.new] do |f| %>