0

私は現在、メンション機能を作成しているので、ユーザーが @ を入力すると、次に入力するユーザー名の部分がスペースが表示されるまでクリック可能になります。これは、文字と数字のみを含むユーザー名を正しく入力したことを前提としています。私はそれが機能する必要があるので、彼らが「こんにちは@ジョン!」と入力した場合 感嘆符 (または文字や数字ではない任意の記号) がユーザー名の一部ではないことを検出し、次のスペースを探す代わりにそれを除外します。

これは私が持っているものです:

while @comment.content.include? "@" do
  at = @comment.content.index('@')
  space = @comment.content.index(' ', at)
  length = space - at
  usernotag = @comment.content[at + 1,length - 1]
  userwtag = @comment.content[at,length]
    @user = User.where(:username => usernotag.downcase).first
    @mentioned_users.push(@user)
  replacewith = "<a href='/" + usernotag + "'>*%^$&*)()_+!$" + usernotag + "</a>"
  @comment.content = @comment.content.gsub(userwtag, replacewith)
end

@comment.content = @comment.content.gsub("*%^$&*)()_+!$", "@")

どうすればいいですか?

4

1 に答える 1

1

ユーザー参照を解析/抽出するには、正規表現を使用する必要があります。

# Transform comment content inline.
@comment.content.gsub!(/@[\w\d]+/) {|user_ref| link_if_user_reference(user_ref) }
@comment.save!

# Helper to generate a link to the user, if user exists
def link_if_user_reference(user_ref)
  username = user_ref[1..-1]
  return user_ref unless User.find_by_name(username)

  link_to user_ref, "/users/#{user_name}"
  # => produces link @username => /user/username
end

これは、ユーザー名が、あなたが言ったように英数字 (文字または数字) に制限されていることを前提としています。他の文字がある場合は、正規表現に含まれるセットにそれらを追加できます。

于 2012-09-16T17:50:59.857 に答える