Ruby on Rails 3 gsub избегает привязки метода link_to - PullRequest
0 голосов
/ 21 февраля 2012

Я хочу проверить строку и изменить любую @something на ссылку.Итак, у меня есть вспомогательная функция, которая состоит из чего-то вроде этого:

def parse(content)
  content.gsub(/@[a-zA-z0-9]+\b/, link_to("#{$1}", user_path($1)) )
end

Но результат <a href="/users/102"></a>

Проблема:

  1. The <a href="/users/102"></a> является строкой, потому что каким-то образом экранированы < и >.
  2. Почему "#{$1}" ничего не возвращает?Разве он не должен возвращать то, что проверено, в этом случае @something?

1 Ответ

3 голосов
/ 21 февраля 2012
  1. Rails HTML-экранирует любой контент, созданный пользовательским помощником, если только вы не запретите это. Попробуйте использовать <%= raw parse(content) %> на ваш взгляд.
  2. Цитировать кирку на gsub:

Если в качестве замены используется строка, специальные переменные из совпадения (например, $ & и $ 1) не может быть подставлено в него, потому что подстановка в строку происходит до совпадения с шаблоном начинается. Однако последовательности \ 1, \ 2 и т. Д. Могут использоваться для интерполяции последовательных нумерованных групп в совпадении, и \ k заменит соответствующие именованные захваты.

Таким образом, вы не можете использовать #{$1}, потому что $1 не устанавливается до тех пор, пока команда не будет выполнена. Лучше всего, вероятно, использовать блочную форму gsub - в этом случае $1 устанавливается внутри блока. Попробуйте:

def parse(content)
  content.gsub(/@[a-zA-z0-9]+\b/) {link_to($1, user_path($1))} 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...