2011-12-22 9 views
5

W Github masz problem i odnosisz się do numeru 31. Następnie, pisząc ten problem, zauważyłeś, że @johnmetta zasugerował kilka możliwych rozwiązań, nad którymi pracuje. Następnie naciśniesz "Wyślij nowy problem", a kiedy to zrobisz, "# 31" i "@johnmetta" są linkami, a @johnmetta został powiadomiony, a numer # 31 ma powiadomienie, że został przywołany.Jak automatycznie łączyć się z obiektami przy składaniu tekstu w Railsach

Zdaję sobie sprawę, że istnieje tutaj więcej niż jedna technologia (przysmaki Javascript, itp.), Ale to, czego szukam, to przykłady tego, jak robić tego typu rzeczy w świecie Railsów. Jest to niezwykle trudny temat do wyszukiwania.

Co mam wymyślić koncepcyjnie jest:

  1. Napij identyfikator, takie jak # lub @, która jest zarezerwowana
  2. po złożeniu, szukać tego identyfikatora w odpowiednim atrybucie
  3. Upon znalezienie go, poszukaj odpowiedniego modelu z polem odpowiadającym temu, co następuje:
  4. Po znalezieniu tego, zamień ten ciąg tekstowy na link
  5. Opcjonalnie, zrób wszystko, co konieczne, aby powiadomić o eferenced sprzeciw

powiedział, że to wydaje jak to jest super proste (wyraźnie oznaczonych, zakłada friendly_id).

To byłby mój pierwszy szlif, ale uważam, że muszą być znacznie bardziej eleganckie rozwiązania.

Dodatkowy aspekt tego pytania: w jaki sposób można pobrać snippit otaczającego tekstu. Metoda brute force polega na wyszukiwaniu n słów przed i m słowach po tym łańcuchu i chwytaniu tego wszystkiego, a następnie chwytaniu tego pod-łańcucha z wyników i przeprowadzaniu wyszukiwania. Nadal wydaje się, że byłoby bardziej eleganckie rozwiązanie.

Odpowiedz

2

To, co opisałeś, to podstawowy sposób; wszystko inne nie jest strasznie bardziej eleganckie. Przydaje się to jako dwie części: jedna jest po otrzymaniu komentarza (kiedy powinieneś robić powiadomienia), a druga jest wyświetlana z komentarzem, kiedy powinieneś zrobić powłoka.

Pozwala to zachować oryginalny komentarz w jego oryginalnej formie, co jest pomocne.

Może położyć after_create (tak powiadomienia nie są wysyłane na każdej edycji) modelu komentarza (zakładając model komentarz, który zawiera pole 'body'):

[edit: dodano kontekstowe info]

after_create :notify_mentions 

def notify_mentions 
    body.scan %r{(.{0,40})@(\w+)(.{0,20})} do |match| 
    username = match[1] 
    context = [match.first, match.last] 
    Notification.send(match, context, self) if User.exists?(:login => username) 
    end 
end 

używam \w+ zamiast \S+, ponieważ ludzie często mówią rzeczy jak:

Hey @ JohnMetta, jak się masz?

i \S+ przechwyci kod ,, który może być nieprawidłowy. Wyciągnięcie z grupy przechwytywania @ pozwala zignorować ją podczas powiadomienia.

The context w powyższych grupach meczów składa się z 40 znaków przed i 20 znaków po dopasowanej nazwie użytkownika dla twojego fragmentu. Dostosuj do smaku.

Następnie podczas wyświetlania wiadomości, to w istocie stworzenie pomocnika coś takiego co miał:

def linkify(body) 
    body.gsub %r{@\w+} do |match| 
    link_to match, :controller => :users, :action => :show, :id => match 
    end 
end 

#gsub jest niesamowite tak, że bierze w bloku i zastępuje z zawartością.

To nie jest o wiele bardziej eleganckie niż to, co miałeś, ale powinno dać całkiem przyzwoity wynik.

+0

Jest to bardzo zbliżone do tego, o czym myślałem, ale nie myślałem o podzieleniu go na dwa bardzo dyskretne kroki z powiadomieniami w metodzie after_create. Nie wiedziałem też o regexowaniu i wyciąganiu tekstu z meczu przed i po meczu. Niesamowite. Dzięki wielkie. – JohnMetta

Powiązane problemy