В представлении Rails 3 как определить URL-адрес в отображаемой строке и отформатировать его как ссылку на этот URL-адрес? - PullRequest
9 голосов
/ 09 февраля 2011

У меня есть комментарии пользователей на моем сайте. Если пользователь добавляет URL в свой комментарий, я бы хотел, чтобы он был отформатирован как ссылка и фактически ссылался на этот URL. Как мне это сделать?

Ответы [ 5 ]

18 голосов
/ 09 февраля 2011

Rails имеет auto_link текстовый помощник.

auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com")
# => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> and
#     say hello to <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"

auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :urls)
# => "Visit <a href=\"http://www.loudthinking.com/\">http://www.loudthinking.com/</a>
#     or e-mail david@loudthinking.com"
8 голосов
/ 06 августа 2012

В rails 3.1 auto_link удален Бен, теперь он является самоцветом: https://github.com/tenderlove/rails_autolink

0 голосов
/ 19 мая 2011

Я бы также рекомендовал подумать о чем-то вроде Markdown для ваших комментариев. Тогда вы можете позволить движку Markdown беспокоиться о таких вещах за вас.

0 голосов
/ 09 февраля 2011

Вы также можете использовать гем "auto_html", см. https://github.com/dejan/auto_html.

Отказ от ответственности: сам еще не использовал его, но похоже, что он может делать то, что вы хотите.

0 голосов
/ 09 февраля 2011

Во-первых, вы должны определить регулярное выражение, соответствующее HTTP-строкам, например

IPv4_PART = /\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]/  # 0-255
REGEXP = %r{
    https?://                                                    # http:// or https://
    ([^\s:@]+:[^\s:@]*@)?                                        # optional username:pw@
    ( (([^\W_]+\.)*xn--)?[^\W_]+([-.][^\W_]+)*\.[a-z]{2,6}\.? |  # domain (including Punycode/IDN)...
        #{IPv4_PART}(\.#{IPv4_PART}){3} )                        # or IPv4
    (:\d{1,5})?                                                  # optional port
    ([/?]\S*)?                                                   
}iux

затем, предположим, что тело комментария является str, вы делаете:

str.gsub(REGEXP) do |m|
    link_to m, m
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...