Rails STI 和视图重用

Posted

技术标签:

【中文标题】Rails STI 和视图重用【英文标题】:Rails STI and views reuse 【发布时间】:2012-03-11 04:24:52 【问题描述】:

我有一个 STI 模型,并希望为派生模型重用基本视图。 例如,如果我有 Teacher

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

如果我理解您的问题...它们默认可用。使用 STI 时,每个派生模型都可以访问基类中的所有字段。 (表中的任何字段)

例如,在渲染局部时,您可以简单地像往常一样传递对象:

= render :partial => 'person', :object => @teacher

上面的代码可以通过多种方式完成,但我只是想说明一下。

【讨论】:

使用这种方法时有没有办法控制布局?执行此操作时,我会在每个项目的末尾获得编辑/删除链接,并且我没有机会添加派生字段(假设我不想将它们放在开头)? 当然。有几种不同的方法可以做到这一点。我不是视图逻辑的忠实拥护者,但你可以有一个 if 语句来检查它是什么人:“if person.kind_of?(Teacher)”【参考方案2】:

如果您有教师和人员控制器,那么您可以从教师视图中的人员渲染视图(部分、模板)。

示例

您可以在教师视图中写下以下几行

= render :partial => 'persons/<PARTIAL NAME>'

= render :template => 'persons/<TEMPLATE>'

= render :file => 'persons/new'

【讨论】:

【参考方案3】:

render 使用正确的部分,所以如果你有 _teacher.html.erb_person.html.erb 部分,你可以 render 老师里面的人部分,当你用一个对象调用 render 时,正确的部分将是渲染:

# @aldo is a Person, this will render _person.html.erb
render @aldo

# @mr_brown si a Teacher, this will render _teacher.html.erb
render @mr_brown

因为在这种情况下,老师会部分呈现你所拥有的人的信息。

【讨论】:

使用这种方法时有没有办法控制布局?执行此操作时,我会在每个项目的末尾获得编辑/删除链接,并且我没有机会添加派生字段(假设我不想将它们放在开头)? 对不起,我不太明白你的意思,你有两个部分,在老师一个中渲染一个人,对吗?没有显示人员的字段吗?

以上是关于Rails STI 和视图重用的主要内容,如果未能解决你的问题,请参考以下文章

处理 Rails 中 STI 子类的路由的最佳实践

重用rails上的视图

Rails:如何跨视图访问模型和控制器数据?

在 Rails 中创建一个与 STI 一起使用的动态子类

Rails 5:在连接表记录上保存记录时的 STI 空键

获取 STI 中的记录以获取 rails 4 中的空 has_many 记录