добавление <a href> к ключевым словам в рельсах - PullRequest
2 голосов
/ 26 мая 2010

В основном, есть некоторые ключевые слова, которые я хочу выбрать и динамически назначить им ссылку.

Как мне поступить в этом?

Допустим, у меня есть что-то вроде этого;

<p>ruby, rails, php, python, django and sinatra</p>

и я хотел бы назначить ссылки на ключевые слова, такие как ruby ​​и python, поэтому конечные результаты должны выглядеть следующим образом;

<p><a href="http://www.ruby-lang.org">ruby</a>, rails, php, <a href="http://www.python.org">python</a>, django and sinatra</p>

Любая помощь или предложение будет высоко ценится!

Ответы [ 5 ]

4 голосов
/ 26 мая 2010

Один из способов сделать это, предполагая, что вы хотите связать только целые слова:

html = "<p>ruby, rails, php, python, django and sinatra</p>"

word_links = { "ruby"   => "http://www.ruby-lang.org",
               "python" => "http://www.python.org" }

html.gsub(/\w+/) do |word|
  word_links[word] ? "<a href=\"#{word_links[word]}\">#{word}</a>" : word
end

Если текст, над которым вы работаете, довольно велик, но список слов, которые вы хотите связать, довольно мал, это можно немного оптимизировать, выполнив подстановку только для подходящих слов:

html.gsub(/\b(#{word_links.keys.join('|')})\b/,
          "<a href=\"#{word_links[$1]}\">#{$1}</a>")

Просто убедитесь, что у вас нет ключевых слов, которые могут появляться внутри открывающего тега (например, внутри значения атрибута, которое полностью нарушит это решение.) Для действительно надежного решения вам придется использовать правильное HTML парсер и просто замени текст контента.

3 голосов
/ 26 мая 2010

Если вы хотите сделать это на стороне сервера до того, как содержимое будет отображено в браузере, вы можете сделать это как

str = "<p>ruby, rails, php, python, django and sinatra scruby rubysd 12ruby'; ruby </p>"

link_hash = {'ruby' => "<a href = 'http://www.ruby-lang.org'>ruby</a>", 'python' => "<a href='http://www.python.org'>python</a>" }

link_hash.each_pair do |key, value|
  str = str.gsub(/\b#{key}\b/, value)
end

str #=> "<p><a href = 'http://www.ruby-lang.org'>ruby</a>, rails, php, <a href='http://www.python.org'>python</a>, django and sinatra scruby rubysd 12ruby'; <a href = 'http://www.ruby-lang.org'>ruby</a> </p>"
0 голосов
/ 26 мая 2010

Вы можете сделать это

сначала получить значения в виде массива (или списка) Пример: рубин PHP питон и т. д.

отправить этот массив помощнику

def link_builder (обр) html_string = ""

для элемента в обр.

 check whether your word needs a wrapper. you might want to do a table check 

 if warpper_needed?

    html_string = html_string + <a href='link'>elment</a>
 else
    html_string = html_string + <p>element</p>
 end

конец

html_string

конец

Надеюсь, у вас есть идея (это может не сработать)

ура, Самира

0 голосов
/ 26 мая 2010

Если вы хотите быть особенно модным, я думаю, вы могли бы использовать фильтр после:

class MyController < ApplicationController
  after_filter :link_stuff

  protected

  def link_stuff
    # You'd want to do this more carefully, so as to only get "ruby"s in text, 
    # not in tags etc.
    response.body.gsub(/ruby/, "<a href = 'http://www.ruby-lang.org'>ruby</a>")
  end
end
0 голосов
/ 26 мая 2010

Просто использовать замену текста? Замените "ruby" на " ruby ​​" и готово. См. String.replace в ссылке на javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...