1

我有一个文章模型:

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 在单词前没有 ' 的地方”的正则表达式?换句话说,如何在不应该​​存在的正则表达式中添加一个字符?还是有更好的方法来解决整个问题?

4

1 回答 1

0

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
于 2013-01-30T18:00:00.823 回答