2009-07-13 53 views
0

我正嘗試在Rails中構建一個簡單的維基系統。Rails中的自動維基鏈接

我想要做的是將雙括號內的單詞自動轉換爲鏈接。

例如如果我有這樣寫的[[例如]一個字

Rails的自動生成像一個鏈接:

/筆記/顯示/例如

的我怎麼能做到這一點任何想法?

非常感謝

回答

0

我會用一個Model callback在保存注意事項生成HTML:

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 

爲了實際瀏覽網址/notes/show/something這樣的URL,你需要告訴Rails如何接受它(Rai ls'show'路線通常會顯示您正在顯示的記錄的ID)。在Notes模型中,進入這樣的事情(我假設你有一個名爲url字段是一個URL友好標題):

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

然後在Notes控制器上添加像這樣的show動作:

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

個人而言,我建議不要寫你自己的語法分析器,只是使用類似Markdown

0

我會使用一個正則表達式來檢查用戶輸入(當有人編輯頁)然後保存轉換那些被發現匹配到的鏈接。

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

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

在您的「頁面」的模式我想有一個字段來存儲轉換的文本,並有一個包含未經過濾的文本虛擬屬性。這個虛擬屬性的「set」方法提供了所有的轉換邏輯。

對於額外的積分,我首先檢查是否存在wiki頁面。

+0

不會gsub更好? - 需要替換字符串而不是僅僅匹配它。添加虛擬屬性和類似的東西好像是用錘子敲碎蒼蠅,特別是因爲這種類型的邏輯應該屬於視圖中,可能在輔助方法中。 – 2009-07-13 12:26:23

0

我猜你想給他/她輸入文本的用戶提供一個文本編輯器。在這種情況下,建議使用Javascript所見即所得的編輯器,如紡織,降價,TinyMCE或YUI。

如果沒有,你可以在解析用戶輸入寫一個正則表達式:

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

鏈接gsub method of String class

0

我不喜歡用插件解決每一個問題,但可能'wikicloth',MediaWiki標記語言的實現會幫助你嗎?