【问题标题】:Clean way to render STI objects without duplicating partials?在不复制部分的情况下渲染 STI 对象的干净方法?
【发布时间】:2012-07-09 12:29:21
【问题描述】:

这是抛出我的完整错误轨道:

缺少带有 {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]} 的部分 publisher_groups/publisher_group。搜索结果:blah blah blah

在组织显示视图中:

<%= render @organization.groups %>

在 /views/groups/_group.html.erb:

<p><%= group.name %></p>
<p><%= group.type %></p>

组模型和组织模型中都存在这种关系。错误引用 PublisherGroup。 Group 模型具有三种类型的 STI,到目前为止,除了指定类型之外什么都不做。由于所有 @organization.group 对象都是 group 的子类,如何让此渲染正常运行?

【问题讨论】:

  • 尝试 'partial_what_you_need', :collection => @organization.groups %>

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

默认情况下,尝试渲染活动模型对象会尝试查找名为 table_name/class_name 的部分对象

特别是对于 STI 层次结构,它将为每个类寻找不同的模板。这是由to_partial_path 实例方法控制的,该方法返回部分路径

如果您在组上覆盖该方法

def to_partial_path
  'groups/group'
end 

然后所有子类将使用相同的部分。

【讨论】:

    【解决方案2】:

    我唯一能想到的是,如果您的模型名为 publisher_group,它将检查这些文件夹。相反,您将使用团体作为惯例。如果不是这样,我建议直接指定路径作为一个简单的解决方案:

    <%= render :partial => "publisher_groups/publisher_group", :collection => @organization.groups %>
    

    【讨论】:

    • 哦,天哪,我想我知道问题出在哪里了。
    • 我直到现在才意识到,但是每个组实际上都是子类,例如 PublisherGroup 等。我认为它们都会被相同的处理,因为它们实际上都在组表中,但是我可以看到现在情况并非如此。任何想法如何干净地处理?
    • 啊,我明白了。我不得不承认我不确定最好的方法,除了尝试使用上面的渲染方法。我在 activerecord SIT 方面的经验非常少。我想这不是我必须使用的东西。
    • 也许您可以按照this question 中的建议为相关控制器重载render
    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多