21

私は自分のアプリで引用メカニズムに取り組んでいます。たとえば、そのトピックのコメント 26 を引用するには、コメント フォームに #26 と入力するだけでよいはずです。
最初にユーザーが 1 つ以上のコメントを引用したいかどうかを確認するために、current_user.comments.build の後、@comment.save の前に if 条件を置きました。
しかし、私の質問をもう少し一般的で適応しやすくするために:

if @comment.content.include?(/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i)

私はこのようなものが欲しいです。その例は、コメントの内容にメールが含まれているかどうかを確認するためのものでした。しかし、論理的には「正規表現を文字列に変換できません」というエラーが表示されます。

インクルードはどのように行うことができますか?正規表現を使用したレールのメソッド? では、テキストに特定の正規表現形式の文字列が含まれているかどうかを確認するには?

または、コントローラーはそのような正規表現アクションの間違った場所ですか?

4

3 に答える 3

54

私はこの方法でルビーの正規表現を行います:

stringObj.match(/regex/)
于 2012-06-09T17:58:19.320 に答える
9

もあります

if @comment.content =~ /regex/

以前のすべてのコメント @prev_comments の配列があり、それらすべてを一度に置き換えたい場合は、次のことができます。

pattern = /#(\d+)/

@comment.content.gsub(pattern) do 
  cur_match = Regexp.last_match
  idx = cur_match[1].to_i - 1
  @prev_comments[idx]
end

トリックは、現在の一致を取得するために Regexp.last_match を使用しているため、スレッド セーフであるかどうか疑問に思いました。どうやら、そうです

以下のより一般的な String 拡張から適応 (盗用)

class String
  def js_replace(pattern, &block)
    gsub(pattern) do |_|
      md = Regexp.last_match
      args = [md.to_s, md.captures, md.begin(0), self].flatten
      block.call(*args)
    end
  end
end

ソース: http://vemod.net/string-js_replace

于 2012-06-09T23:59:25.723 に答える