Rails:使用gsub查找和建立链接

时间:2013-07-22 03:59:47

标签: ruby-on-rails ruby-on-rails-3

我在模型中有一个名为body的文本区域。我想将每个图像更改为该图像的链接。我有这个方法应该这样做,但似乎没有用。它打破了每个图像。

def get_images_in(body)
  body_with_links = body.gsub( %r{http://[^\s<]+} ) do |url|
    if url[/(?:png|jpe?g|gif|svg)$/]
      "<a href='#{url}' target='_blank'><img src='#{url}' /></a>"
    end
  end
  return body_with_links
end

有什么想法吗?感谢您!

更新

Here's指向带有示例正文文本的要点的链接。

1 个答案:

答案 0 :(得分:3)

首先,您不需要在ruby中使用return语句。 Ruby默认会返回最后一件事。在您的情况下,这是从gsub

返回的字符串
def wrap_image_with_link(body)
  body.gsub( %r{http://[^\s<]+} ) do |url|
    if url[/(?:png|jpe?g|gif|svg)$/]
      "<a href='#{url}' target='_blank'><img src='#{url}' /></a>"
    end
  end
end

这仍然不太对劲。然后我将我的初始正则表达式集中在img标签上:

def wrap_image_with_link(body)
  body.gsub(/\<img.*src\=['"](.*)['"].*\/\>/) do |url|
    "<a href='#{url}' target='_blank'><img src='#{url}' /></a>"
  end
end

Rails有几个帮助来清理它。

def wrap_images_with_links(body)
  body.gsub(/\<img.*src\=['"](.*)['"].*\/\>/) do    
    link_to(image_tag($1), $1, :target => '_blank')
  end
end

你可能想让reg ex不区分大小写:

def wrap_images_with_links(body)
  body.gsub(/.*\<img.*src\=['"](.*)['"].*\/\>/i) do    
    link_to(image_tag($1), $1, :target => '_blank')
  end
end

所以gsubsub相反,会更改匹配的reg-ex的每个实例,因此需要稍微调整一下reg ex以适应更明确的匹配:

def wrap_images_with_links(body)
  body.gsub(/\<img[\s\w"=]+src\=['"](http[s]?:\/\/[\w.\/]+)['"]\s?[\/]?\>/i) do    
    link_to(image_tag($1), $1, :target => '_blank')
  end
end

根据您网址的复杂程度,您可能需要调整reg-ex以支持?或除空格以外的字符,但这项工作非常顺利。