2013-07-22 21 views
0

我在模型中有一個名爲body的文本區域。我想將每張圖片都更改爲該圖片的鏈接。我有這樣的方法應該這樣做,但它似乎並沒有工作。它在每張圖片上都會打破。Rails:使用gsub查找並建立鏈接

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 

任何想法?謝謝!

UPDATE

Here's鏈接到與樣本文本主體的依據。

回答

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前不區分大小寫:

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

所以gsub,而不是sub,改變匹配REG-EX的每個實例,所以需要稍微調整了reg前以適應更明確的匹配:

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支持?或空白以外的字符,但是這項工作非常好。

+0

感謝您的努力。是的,我希望它是相同的鏈接:它將像一個縮放功能。 –

+0

我從來沒有使用gsub的塊版本,所以讓我弄清楚。 –

+0

@emm一定要檢查最後的實現。它應該適合你。根據你的img標籤如何形成,你可以調整註冊前如果它不適合你。 –