2012-02-21 38 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