Rails STI Mystery - Почему вид изменится с класса на строку? - PullRequest
1 голос
/ 06 марта 2012

Это долго, поэтому я надеюсь, что вы потерпите меня ...

У меня есть модель под названием Update с двумя подклассами, MrUpdate и TriggeredUpdate. Используя наследование одной таблицы, добавили поле типа в качестве строки для обновления.

На мой взгляд, я проверяю, какой это тип, чтобы решить, что отображать. Я предположил, так как тип является строкой, я должен сделать

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

Это не удалось, т. Е. Было установлено значение false, когда обновление было MrUpdate. Я заметил, что на этом этапе @ update.type.type - это Class. ОК, что угодно, подумал я, поэтому я изменил его на:

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

и это сработало, т. Е. Сравнение оценивалось как истинное, когда обновлением был MrUdpate. Затем я сделал это снова, на мой взгляд, и снова произошел сбой (т. Е. Он был оценен как ложный, когда обновление было MrUpdate.)

Оказывается, виновником является пара <% = link_to ...%> вызовов, которые я использую и превращаю в кнопки с помощью 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

Он меняется от класса к строке! Так что, черт возьми, я делаю неправильно или отсутствует здесь? Почему ссылка должна делать это? Во-первых, мне непонятно, почему это не строка в первую очередь, но потом я действительно не понимаю, почему это изменится ...?!? Любая помощь или объяснение будет полезно. Я могу просто закодировать это одним способом вверху и другим способом внизу, но в этом и заключается безумие. Мне нужно понять, почему это происходит.

1 Ответ

1 голос
/ 10 марта 2012

Я понял, в чем проблема здесь.Спасибо fl00r за указание пути.

Да, тип зарезервирован в Ruby 1.8.7, который сообщает вам класс объекта, из которого вы вызываете его.Но также верно и то, что это имя поля, используемого в Rails для обозначения наследования одной таблицы и для хранения имени класса каждого экземпляра подкласса.

Поэтому я наивно пытался получить доступ к значениюполя типа, используя @ update.type.Но то, что это делало в верхней части представления, вызывало метод типа класса Object в Ruby.По какой-то причине после вызовов link_to он получил доступ к значению поля типа таблицы обновлений.

Пытаясь выяснить это, я вызвал @ update.type в консоли Rails и увидел это сообщение.: "предупреждение: тип объекта устарел; используйте класс объекта #".Наконец это зарегистрировало то, что я делал.Когда я изменил свои звонки на:

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

все работает как положено.Я никогда не видел призыв определить тип на одной из страниц, которые я нашел через Google о STI.И это несмотря на то, что всем им рекомендовано использовать только один контроллер, причем иногда вам необходимо определить класс имеющегося у вас экземпляра.

Итак, глупая ошибка - ошибка пилота.Но, возможно, это поможет кому-то еще, кто запутался в этом.

...