문제

빠른 배경 : 다른 페이지에 대한 참조가 포함 된 문자열이 있습니다. 페이지는 "#12"형식을 사용하는 것과 연결되어 있습니다. 해시와 페이지의 ID가 뒤 따릅니다.

다음 문자열이 있다고 말합니다.

str = 'This string links to the pages #12 and #125'

링크가 필요한 페이지의 ID를 이미 알고 있습니다.

page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]

페이지 ID를 통과하고 #12 및 #125를 해당 페이지에 연결하려면 어떻게해야합니까? 내가 겪는 문제는 다음을 수행하는 것입니다 (레일에서) :

page_ids.each do |id|
  str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end

이것은 #12에 적합하지만 #125의 "12"부분을 ID가 12 인 페이지에 연결합니다.

모든 도움은 굉장 할 것입니다.

도움이 되었습니까?

해결책

인덱스가 항상 단어 경계로 끝나면 다음과 일치 할 수 있습니다.

page_ids.each do |id|
  str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end

단어 경계 기호 만 추가하면됩니다 \b 검색 패턴에서 교체 패턴에 필요하지 않습니다.

다른 팁

먼저 ID를 추출한 다음 교체하는 대신 한 번에 간단히 찾아서 교체 할 수 있습니다.

str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }

다른 곳에서 ID를 필요로하기 때문에 추출 단계를 제거 할 수 없더라도 각 ID에 대한 전체 문자열을 통과 할 필요가 없기 때문에 훨씬 더 빠릅니다.

추신 : if str 다른 곳에서는 언급되지 않으므로 사용할 수 있습니다. str.gsub! 대신에 str = str.gsub

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top