我有一个文章模型:
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