Githubに問題があり、問題31を参照してください。そして、この問題を書いている間、あなたは@hohnmettaが彼が取り組んでいるいくつかの可能な解決策を示唆していることに気づきました。その後、 "Submit New Issue"を押すと、 "#31"と "@johnmetta"がリンクになり、@hohnmettaに通知され、#31のissueにはそれが参照されたという通知があります。Railsでテキスト提出でオブジェクトに自動的にリンクする方法
ここには、複数の技術があることが分かりましたが(Javascriptなど)、私が探しているのは、Railsの世界でこのようなことをする方法の例です。それは興味深いことに難しい検索対象です。
私は概念的を作ってみたことはある:
- 適切な属性でその識別子の検索
- すると、#またはその@が提出されると
- を予約されているなど、いくつかの識別子を持っていますそれに続くフィールドに一致するフィールドを持つ適切なモデルを検索する
- 見つかったら、そのテキスト文字列をリンクで置き換えます。
- オプションで、rそれは超簡単ですように言っeferencedオブジェクト
、それはは(明示的にコード化され、friendly_idを想定)ようです。
def prettify_user_links(str, source):
result = str
str.scan(/(@\S+)+/).each do |mtch|
# Strip off whatever identifier we're using
search_string = mtch[0].gsub('@','')
# Search for the matching model in the appropriate table
user = User.find(search_string)
if user
# If we find a matching model, create some link text and link it
link_txt = "<a href=>'#{user.url}'>#{mtch}</a>"
result.gsub!(search_string, link_txt)
# Notification. Not sure how/where, maybe with a message bus, or something more brute-force like
Comment.create :user_id => user.id, :body => "You have been mentioned in #{link_to comment.excerpt, comment} by #{link_to comment.owner, owner}"
return result
これは私の最初のカットになりますが、はるかに洗練されたソリューションが必要だと感じています。
この質問に対する追加の側面:周囲のテキストのスニッピットをどのように捉えますか?ブルートフォースの方法は、その文字列の前にn個の単語を検索してからm個の単語を検索し、そのすべてを取得し、その結果からそのサブ文字列を取得して検索することです。それでも、より洗練されたソリューションがあるようです。
これは私が思っていたものにかなり近いですが、after_createメソッドの通知で2つの非常に個別のステップに分割することは考えていませんでした。そして、私は前と後の試合からテキストを正規表現したり引っ張ったりすることについて知らなかった。驚くばかり。本当にありがとう。 – JohnMetta