1

私は記事モデルを持っています:

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

ここで、単語が別の記事の名前でもある場合に備えて、記事内のすべての単語をリンクに自動的に置き換える before_save :createlinks コールバックを追加したいと考えています。たとえば、「テスト」という記事があり、「ここでテストを見ることができます」という内容の新しい記事を作成します。「a」と「here」の間に「Test」記事への自動リンクが必要です。

私のアプローチは、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

それ自体にリンクする記事を避けるための最初のunless行。これは最初の更新アクションでは問題なく機能しますが、2 番目の更新ではすべての「link_to 'Test'.etc...」が「link_to 'link_to' etc」に置き換えられます。

したがって、gsub が 2 つの '-characters の間にあるすべての名前を置き換えることを除外したいと思います (つまり、すでに link_to 'Test' で置き換えられています)。私のアプローチは次のとおりです。

self.content =~ /'#{article.name}'/ || でない限り self.name == 記事.name

これも原則として機能しますが、1 つの「テスト」が見つかるとすぐに gsub 全体がスキップされるため、1 つのリンクが作成されるとすぐに他のリンクが設定されなくなるという結果につながります。

これを解決する最善の方法は何ですか? 「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 に答える