使用注释中的正则表达式创建link_to

时间:2016-05-19 17:25:21

标签: ruby-on-rails ruby regex

我试图创建一个帮助器,找到任何以#后面开头的数字,然后删除#,然后将其转换为链接。

但是,我并不完全确定我做错了什么,现在评论显得空白。

我该如何正确地做到这一点?

到目前为止,我有:

textarea

在我看来:

module ApplicationHelper
    def linkhelper (comment)
        link = comment.to_s.gsub (/a?#\d.*\d/)
        if Post.friendly.exists?(@link)
            boardid = self.board_id
            postid = link
            link_to "#link", boardid.postid, :anchor => link
        elsif Reply.exists?(:pid => @link)
            boardid = self.board_id
            postid = reply.link.post_id
            link_to '#link', boardid.postid, :anchor => link
        else '#link'
        end
    end
end

更新
目前我的网站设置如下:董事会有很多帖子,每个帖子都有很多回复。在发布帖子时,它会检查所有帖子和该评论板的回复之间的最高<% linkhelper(post.comment) %> ,并将其设置为pid

我想做的是:

匹配maximum pid + 1,删除#123

如果匹配任何#获取Post.pid,请将post.board_id替换为#123

elsif如果匹配任何Reply.pid获取link_to #123, board_id/123reply.post_id。将{123替换为reply.board_id

其他只是放link_to #123, board_id/post_id#123

我最终使用的代码:

#123

1 个答案:

答案 0 :(得分:1)

这应该接近你想要做的事情:

def linkhelper(comment)
  link = comment.to_s.gsub (/#(\d+)\s+/) do |match|
    slug = $1.strip
    if (post = Post.friendly.find_by(id: slug))
      link_to "##{slug}", "#{post.board_id}/#{slug}"
    elsif (reply = Reply.friendly.find_by(pid: slug.to_i))
      link_to "##{slug}", "#{reply.board_id}/#{reply.post_id}##{slug}"
    else
      "##{slug}"
    end
  end
end

这会将gsub与块一起使用,以便您可以很好地控制要替换的内容,因此link_to应包含您期望的链接。