Rails STI之谜 - 为什么类型在视图中从Class更改为String?

时间:2012-03-05 22:06:23

标签: ruby-on-rails-3 inheritance single-table-inheritance

这很长,所以我希望你能忍受我......

我有一个名为Update的模型,它有两个子类,MrUpdate和TriggeredUpdate。使用单表继承,将类型字段作为字符串添加到Update。

在我看来,我正在检查决定要显示什么的类型。我假设因为type是一个字符串,我应该做

<% if @update.type == 'MrUpdate' %>

此操作失败,即当更新为MrUpdate时,它评估为false。我注意到,此时@ update.type.type是Class。好吧,无论如何,想到我,所以我把它改成了:

<% if @update.type == MrUpdate %> 

并且它起作用,即当更新是MrUdpate时,比较评估为true。然后我再次在我的视图中降低了它再次失败(即,当更新是MrUpdate时,它评估为false。)

原来,罪魁祸首是几个&lt;%= link_to ...%&gt;我使用的调用和使用jQuery的按钮。如果我将此代码放在我的视图中:

<br>
<%=  @update.type.type %><br>
<%=  @update.type %><br>

<%= link_to 'New Note', new_note_path(:update_id => @update.id), :class => "ui-button" %>

<br>
<%=  @update.type.type %><br>
<%=  @update.type %><br>

我看到的是:

Class
MrUpdate

(the New Note button)

String
MrUpdate

它正在从一个类变为一个字符串!那么我在这里做错了什么或遗失了什么?为什么link_to应该这样做?首先,我不清楚为什么它首先不是一个字符串,但后来真的很困惑为什么它会改变......?!?任何帮助或解释都会有所帮助。我可以在顶部以一种方式编码,在底部以另一种方式编码,但这种疯狂的方式。我需要了解为什么会这样。

1 个答案:

答案 0 :(得分:1)

我弄清楚这里的问题是什么。感谢fl00r指明方向。

是的,类型是Ruby 1.8.7中保留的,它告诉你从中调用它的对象的类。但它也是如此,它是Rails中用于表示单表继承并存储子类的每个实例的类名称的字段的名称。

所以我天真地尝试使用@ update.type访问类型字段的值。但是在视图顶部做的是调用Ruby中Object类的type方法。无论出于何种原因,在link_to调用之后,它都会访问更新表的类型字段的值。

在尝试解决这个问题时,我在Rails控制台中调用了@ update.type并看到了这条消息:“warning:Object#type已弃用;请使用Object#class”。最后,它注册了我正在做的事情。当我将呼叫改为:

<% if @update.class == MrUpdate %>

一切都按预期工作。我从来没有看到一个电话来确定我通过Google找到的有关STI的任何页面中的类型。尽管他们都建议只使用一个控制器,但有时你必须确定你拥有的实例的类。

所以,愚蠢的错误 - 飞行员错误。但也许这会帮助那些被绊倒的人。