2012-06-13 43 views
4

好吧,所以我想要做的是在父类中有一个模板,它在默认模板中加载一个部分。这部分虽然应该是特定于派生类。Rails 3 STI负载派生部分

def class DataItem < ActiveRecord::Base 
    def value 
    # do something fancy here 
    end 
end 

def class FooDataItem < DataItem 
    def value 
    "foo" 
    end 
end 

def class BarDataItem < DataItem 
    def value 
    "bar" 
    end 
end 

然后,我们有以下的视图结构:

  • 应用/视图/ data_item/index.html.erb
  • 应用/视图/ data_item/_col_info.html.erb
  • 应用程序/视图/ foo_data_item/_col_info.html.erb
  • 应用/视图/ bar_data_item/_col_info.html.erb

在index.html.erb,我们有这样的事情:

<table> 
    <thead> 
    <tr> 
     <th>Key</th> 
     <th>Value</th> 
    </tr> 
    </thead> 
    <tbody> 
    <% @dataItems.each do |item| %> 
    <tr> 
     <td><%= render :partial, item + "/col_info", :locals => { :item => item } %> 
     <td><%= item.value %> 
    </tr> 
    <% end %> 
    </tbody> 
</table> 

所以,我知道我可以加载部分只是该项目的对象,但我是一个局部的,是不是只为对象,但一个子部分。

一种选择是在views/data_item/_col_info.html.erb中创建一个只包含if/else块的单个部分,然后加载一个单独的部分,但我希望有一个更清晰的方法来做到这一点STI。

另外请注意,我不能使用item.type作为生成路径的方法,因为我在视图目录结构中有下划线(类型为foodataitem,但我需要foo_data_item)。

+0

所以,这不是我的想法解决方案,但我确实在基类“template_path”中创建了一个被子类覆盖的函数。仍然不知道,但它至少让我这样做。 – alex

回答

1

我意识到,你不能使用类的名称单独产生的路径,但你可以做这样的事情:

item.class.name.underscore 

这会更方便,然后还要加一个template_path方法到每个班级。 underscore method来自ActiveRecord,它会将您的骆驼案例类名称转换为正确的格式。