2009-07-13 7 views
0

Ich versuche, ein einfaches Wiki-System in Rails zu bauen.Automatische Wiki-Links in Rails

Was ich möchte, ist, automatisch Wörter in doppelten Klammern in Verknüpfungen zu verwandeln.

z. wenn ich ein Wort habe wie dieses [[Beispiel]] geschrieben

Rails generiert automatisch einen Link wie:

/note/Show/example

Irgendwelche Ideen, wie ich dies tun könnte?

Vielen Dank

Antwort

0

ich ein Model callback verwenden würde die HTML beim Speichern des Hinweises zu generieren:

class Note < ActiveRecord::Base 
    before_save :generate_html 

    # ...other stuff... 

    def generate_html 
    # 'html' is a field whose value is a HTML version of the 'content' field 
    self.html = self.content.gsub(/\[{2}([a-z]*?)\]{2}/) { |match| link_to $1, "/notes/show/#{$1}" } 

    # generate other html... 
    end 
end 

Um die Notiz tatsächlich an einer URL wie /notes/show/something anzuzeigen, müssen Sie Rails mitteilen, wie man es akzeptiert (Rai ls 'show' Routen erwarten normalerweise die ID des Datensatzes, den Sie anzeigen. In Ihrem Notes-Modell, geben Sie so etwas wie diese (Ich gehe davon aus, dass Sie ein Feld haben url genannt, die eine URL freundliche Titel ist):

def Note.find_by_id_or_url id 
    Note.find :first, :conditions => ['id = ? or url = ?', id, id] 
end 

Und dann in den Notes-Controller, fügen Sie so etwas wie dies für die show Aktion:

@note = Note.find_by_id_or_url(params[:id]) 

persönlich würde ich empfehlen nicht Ihren eigenen Syntax-Parser zu schreiben und nur so etwas wie Markdown verwenden.

0

ich einen regulären Ausdruck von Benutzereingaben verwenden würde zu überprüfen (wenn jemand die Seite bearbeitet) dann auf diese Spiele gefunden in Links speichern konvertieren.

reg = Regexp.new('\[{2}[a-z]+\]{2}') 
reg.match(page.content) do |match| 
    #your code here 
end 

Siehe http://www.regular-expressions.info/ruby.html

Auf Ihrer „Seite“ Modell würde ich ein Feld haben den umgewandelten Text zu speichern und ein virtuelles Attribut, das ungefilterte Text enthält. Die "set" -Methode dieses virtuellen Attributs liefert dann die gesamte Konvertierungslogik.

Für zusätzliche Bonuspunkte würde ich zuerst überprüfen, ob die Wiki-Seite existiert.

+0

wäre gsub nicht besser? - Ersetzt die Zeichenfolge, anstatt sie nur anzupassen.Hinzufügen von virtuellen Attributen und dergleichen scheint wie eine Fliege mit einem Klumpen Hammer zu zerschlagen, zumal diese Art von Logik ist, die in die Ansicht gehören sollte, möglicherweise innerhalb einer Hilfsmethode. –

0

Ich schätze, Sie möchten dem Benutzer einen Texteditor zur Verfügung stellen, über den er den Text eingeben wird. In diesem Fall empfiehlt es sich, Javascript WYSIWYG-Editoren wie Textile, Markdown, TinyMCE oder YUI zu verwenden.

Wenn nicht, können Sie einen regulären Ausdruck schreiben, während die Eingabe Benutzer-Analyse:

pattern = Regexp.new('\[\[([a-zA-Z]+)\]\]') # Replace [a-zA-Z]+ with your choice of text match 
link_converted_text = entered_text.gsub(pattern) {|match| link_generator_function(match[1]) } 

Link zu gsub method of String class

0

Ich mag es nicht, jedes Problem mit einem Plugin zu lösen, aber vielleicht 'wikicloth', eine Implementierung der MediaWiki-Auszeichnungssprache würde Ihnen helfen?

Verwandte Themen