Ruby on rails - 用于设置自动链接的正则表达式



我有一个文章模型:

class Article < ActiveRecord::Base
  attr_accessible :name, :content
end

我现在想添加一个 before_save :createlinks 回调,它会自动用链接替换文章中的所有单词,以防该单词也是另一篇文章的名称。 例如,我有一篇名为"测试"的文章,我创建了一个新文章,内容为"你可以在这里看到一个测试"。我需要在单词"a"和"here"之间自动链接到"测试"文章。

我的方法是在article.rb中添加:

before_save :createlinks
def createlinks
  Article.all.each do |article|
    unless self.name == article.name
      self.content.gsub!(/#{article.name}/i, "<%= link_to '#{article.name}', 'http://localhost:3000/articles/#{article.id}' %>")
    end
  end
end

第一个除非行只是为了避免文章链接到自身。这对于第一个更新操作来说效果很好,但秒更新会替换所有"link_to'测试'。等等..."与"link_to'link_to'等"。

所以我想排除 gsub 替换两个"字符"之间的所有名称(这意味着它已经替换为link_to"测试")。我的方法是:

除非 self.content =~/'#{article.name}'/|| self.name == article.name

原则上,这也很有效,但这会导致一个结果,即一旦创建了一个链接,就不会再设置其他链接,因为一旦找到一个"测试",就会跳过整个 gsub。

解决这个问题的最佳方法是什么?是否有"替换所有 self.content article.name 但前提是 article.name 单词前没有 ' "的正则表达式?换句话说,如何在正则表达式中添加不应该存在的字符?还是有更好的方法来解决整个问题?


def extract_name(title)
  match = title.match /'(.*)'/
  match ? match[1] : title
end
def createlinks
  Article.all.each do |article|
    extracted_title = extract_name(article.name)
    unless self.name == extracted_title
      self.content.gsub!(/#{article.name}/i, link_to(extracted_title, 'http...'), 'http://localhost:3000/articles/#{article.id}' %>")
    end
  end
end

相关内容

  • 没有找到相关文章

最新更新