2009-07-13 5 views
0

J'essaye de construire un système wiki simple dans Rails.Liens Wiki automatiques dans Rails

Ce que je voudrais faire est de transformer automatiquement les mots entre crochets doubles en liens.

E.g. si j'ai un mot écrit comme ceci [[exemple]]

Rails génère automatiquement un lien comme:

/notes/show/exemple

Toute idée de la façon dont je pourrais le faire?

Un grand merci

Répondre

0

J'utiliser un Model callback pour générer le code html lors de l'enregistrement de la Note:

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 

Afin de réellement voir la note à une URL comme /notes/show/something vous devez dire à Rails comment l'accepter (Rai Les routes 'show' attendent généralement l'ID de l'enregistrement que vous montrez. Dans votre modèle Notes, entrez quelque chose comme ça (je suppose que vous avez un champ appelé url qui est une URL conviviale titre):

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

Et puis dans le contrôleur Notes, ajouter quelque chose comme ça pour le show Action:

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

Personnellement, je ne recommanderais pas d'écrire votre propre analyseur de syntaxe et juste utiliser quelque chose comme Markdown.

0

j'utiliser une expression régulière pour vérifier l'entrée d'utilisateur (lorsque quelqu'un édite la page), puis lors de l'enregistrement convertir les correspondances trouvées en liens.

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

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

Je Sur votre modèle « Page » ont un champ pour stocker le texte converti et un attribut virtuel qui contient du texte non filtré. La méthode "set" de cet attribut virtuel fournit alors toute la logique de conversion.

Pour ajouter des points bonus, je vérifie d'abord si la page wiki existe.

+0

ne serait pas gsub être mieux? - nécessite le remplacement de la chaîne plutôt que de la faire correspondre.L'ajout d'attributs virtuels ressemble à briser une mouche avec un marteau, d'autant plus que ce type de logique devrait appartenir à la vue, éventuellement à l'aide d'une méthode d'aide. –

0

Je suppose que vous voulez fournir un éditeur de texte à l'utilisateur par lequel il/elle entrera le texte. Dans ce cas, il est recommandé d'utiliser des éditeurs Javascript WYSIWYG tels que textile, markdown, TinyMCE ou YUI.

Sinon, vous pouvez écrire une expression régulière lors de l'analyse de l'entrée utilisateur:

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]) } 

Lien vers gsub method of String class

0

Je n'aime pas résoudre tous les problèmes avec un plugin mais peut-être 'wikicloth', une implémentation du langage de balisage MediaWiki vous aiderait?

Questions connexes