2012-02-21 76 views
0

我想檢查一個字符串並將任何@something更改爲鏈接。所以,我有它由這樣的一個輔助功能:Ruby on Rails 3 gsub轉義link_to方法的錨點

def parse(content) 
    content.gsub(/@[a-zA-z0-9]+\b/, link_to("#{$1}", user_path($1))) 
end 

但結果是<a href="https://stackoverflow.com/users/102"></a>

的問題是:

  1. <a href="https://stackoverflow.com/users/102"></a>是一個字符串,因爲不知何故<>已被轉義。
  2. 爲什麼"#{$1}"什麼都不返回?是不是應該返回檢查的東西,在這種情況下@something

回答

3
  1. Rails的HTML的溢出由用戶定義的助手產生的任何內容,除非你告訴它不要。在您的視圖中嘗試使用<%= raw parse(content) %>
  2. 引用鎬上gsub

如果字符串被用作替換,從匹配的特殊變量(例如$ &和$ 1) 無法代入的,因爲置換到字符串發生在模式匹配 開始之前。但是,序列\ 1,\ 2等等可用於在匹配中內插連續編號的 組,名稱爲>的名稱將替換相應的命名捕獲。

因此,您不能使用#{$1},因爲$1直到命令完成後才設置。您最好的選擇可能是使用gsub的塊形式 - 在這種情況下$1設置在塊內。嘗試:

def parse(content) 
    content.gsub(/@[a-zA-z0-9]+\b/) {link_to($1, user_path($1))} 
end 
+0

我試過你的解決方案,但現在的錨文本,並在href都是一樣的,我的意思是,$ 1點返回相同的數值是:/users/102。有任何想法嗎? – Henson 2012-02-21 09:36:18

+0

沒關係,我正在使用像這樣的塊,它現在可以工作。 {| str | link_to(str,$ 1)}謝謝! – Henson 2012-02-21 09:39:42