我有一个文章模型:
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 'Test'.etc...”。
所以我想排除 gsub 替换两个 '-characters 之间的所有名称(这意味着它已经替换为 link_to 'Test')。我的做法是:
除非 self.content =~ /'#{article.name}'/ || self.name == 文章名
原则上,这也有效,但这会导致一旦创建一个链接,就不会再设置其他链接,因为一旦找到一个“测试”,整个 gsub 就会被跳过。
解决这个问题的最佳方法是什么?是否有“替换所有 self.content 是 article.name 但仅当 article.name 在单词前没有 ' 的地方”的正则表达式?换句话说,如何在不应该存在的正则表达式中添加一个字符?还是有更好的方法来解决整个问题?