2012-09-24 3 views
1

나는 텍스트 편집을하고 있고 위키와 같은 링크를 허용하는 레일 애플리케이션을 가지고있다. 나는 당신이 [[: slug]]를 설명에 쓸 수 있도록 그것을 작동시킬 수 있었고 링크 텍스트가 데이터베이스에 저장된 이름 인 관련 페이지에 대한 링크를 생성합니다. 나는 이것을 써서 [[: slug | 일부 텍스트]] 링크는 이름 대신 "일부 텍스트"라고 말합니다. 또한 사용자 지정 링크 텍스트를 포함하도록 옵션으로 만들고 싶습니다.레일즈에서 위키와 같은 링크를 개선하려면 어떻게해야합니까?

다음은 내가 사용하고있는 코드입니다.

def replace_slugs(text) 
    slugs = text.scan(/\[{2}:([^\]]*)\]{2}/).map{|s|s[0]} 
    Character.where(:slug => slugs).each{|ch| text.gsub!("[[:#{ch.slug}]]", 
    link_to(ch.name, adventure_character_path(ch.adventure, ch)))} 
    return text 
end 
+1

[Regexp Capture Groups] (http://ruby-doc.org/core-1.9.3/Regexp.html#label-Capturing)을 사용하여 거기에서 슬럿과 link_title을 추출 할 수 있습니다. –

+0

@ThomasKlemm 링크를 보내 주셔서 감사합니다. 내가 생각해 낸 답을 게시 할 것이다. 귀하의 의견에 +1을 드리고 싶지만이 사이트는 완전히 새로운 것입니다. 등급을 어떻게 올리나요? – hoonsan

+0

고마워요. 일부 답변에 upvotes가 표시되고 특정 임계 값을 초과하면 바로 의견을 upvote 할 수 있습니다. 아래 답변으로 당신의 일하는 해결책을 게시하여 사람들이 그것으로부터 배울 수 있다면 좋을 것입니다. –

답변

2

레일스 및 문자열 검색을위한 regexp에 대한 연구가 끝나면 제 질문에 대한 답을 찾았습니다. 여기에 내가 지금 사용하고 방법에 대한 코드입니다 : 때문에 내가 정규 표현식을 공식화하는 방식의

def replace_slugs(text, characters) 
    # Regexp that will recognize wiki urls with pipes and return 2 items 
    # It also ignores wiki urls that don't have a pipe 
    # /\[\[:([^|\]]*)?\|([^\]]+)\]\]/ 
    links = text.scan(/\[\[:([^|\]]*)?\|([^\]]+)\]\]/) 
    for link in links do 
    slug = link[0] 
    title = link[1] 

    # I'm stripping out the whitespace when I do my find and for my link 
    # This makes it so you can have whitespace before and after the pipe 
    # e.g. [[:slug|Title]] [[:slug | Title]] [[:slug | Title]] 
    ch = characters.find_by_slug(slug.strip) 
    text.gsub!("[[:#{slug}|#{title}]]", link_to(title.strip, 
     adventure_character_path(ch.adventure, ch))) if ch 
    end 

    slugs = text.scan(/\[{2}:([^\]]*)\]{2}/).map{|s|s[0]} 
    characters.where(:slug => slugs).each{|ch| text.gsub!("[[:#{ch.slug}]]", 
    link_to(ch.name, adventure_character_path(ch.adventure, ch)))} 
    return text 
end 

, 나는 형태의 두 링크가있는 경우 두 개의 별도의 통화를했다 [[: 강타]]와 [[: slug | 제목]]. 그 때문에 문자로 불리는 메소드에 추가 변수를 추가했습니다. 그래서 나는 값 비싼 데이터베이스를 검색하는 대신 메서드를 호출하는 곳에서 문자 배열을 전달할 수 있습니다. 사용하려는 문자 목록을 이미 알고 있습니다.

관련 문제