Я только начал работать над сайтом, который поможет людям понять, о чем говорят рэперы. Пользователи увидят текст песни к рэпу и смогут щелкнуть текст песни, чтобы увидеть объяснение. Вот скриншот (вы также можете проверить сам сайт здесь ):
альтернативный текст http://img146.imageshack.us/img146/6882/clocal.png
(Оригинальная лирика подверглась цензуре; нажмите здесь , чтобы увидеть их)
В любом случае, мой вопрос заключается в том, как смоделировать эти аннотации в моем приложении. Прямо сейчас я храню текст и аннотации в виде одного большого куска HTML в следующем формате:
<div class="lyrics">
With the goons I spy
<a href="#note1">Stay in tune with ma</a>
<a href="#note2">She like damn
This the realest since 'Kumbaya'</a>
Kumbayay Killa Cam my lord
</div>
<div class="annotations">
<div id="note1">
"Ma" refers to ladies, generally, and specifically also the woman singing the hook; "Stay in tune" is a musical metaphor: he literally stays in tune with the singer and also in the sense that he has game.
</div>
<div id="note2">
Kumbaya is a campfire singalong.
</div>
</div>
, а затем обработать его с помощью этого метода для вывода:
class Song < ActiveRecord::Base
include ActionView::Helpers
def annotated_lyrics
lyrics = read_attribute('annotated_lyrics')
return if lyrics.blank?
require 'hpricot'
doc = Hpricot lyrics
doc.at('.lyrics').inner_html = doc.at('.lyrics').inner_html.strip
doc.search("a[@href^='#note']").set('class', 'tooltip').each do |t|
t.inner_html = t.inner_html.strip
end
doc.search("div[@id^='note']").set('class', 'annotation').each do |a|
a.inner_html = auto_link(a.inner_html.strip, :all, :target => '_blank')
end
simple_format doc.html.strip
end
end
и все остальное я делаю с jQuery и фантастическим qTip плагином.
Это прекрасно работает для отображения, но, поскольку мое приложение не знает о связи между аннотациями и текстами, будет трудно, скажем, добавить интерфейс для обновления отдельной встроенной аннотации (или вообще вообще).
С другой стороны, я не знаю, как лучше всего представить это в ActiveRecord. Я полагаю, что песня может иметь аннотации "have_many", но как бы я представлял, какие тексты были аннотированы? Я мог бы сохранить индекс начала и конца слова, но это кажется болезненным и чувствительным к незначительным изменениям в тексте.