2012-06-09 16 views
18

Ich arbeite an einem Angebotsmechanismus in meiner App, wo es einfach möglich sein sollte, # 26 zum Beispiel in das Kommentarformular einzugeben um den Kommentar 26 zu diesem Thema zu zitieren.
Um zu überprüfen, ob ein Benutzer an erster Stelle einen oder mehrere Kommentare zitieren möchte, setze ich eine if-Bedingung nach meinem current_user.comments.build und vor @ comment.save.
Aber nur meine Frage etwas allgemeiner und leichter zu adaptieren:Rails 3 - Prüfe, ob String/Text ein bestimmtes Wort/Zeichen über Regex in Controller enthält

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

Ich möchte so etwas. In diesem Beispiel wurde überprüft, ob der Inhalt des Kommentars E-Mails enthält. Aber logisch bekomme ich einen Fehler "Kann Regexp in String nicht konvertieren".

Wie können Sie das Include? Methode in Schienen mit einem Regexp? Also, um zu überprüfen, ob ein Text eine Zeichenfolge eines bestimmten Regex-Formats enthält?

Oder ist der Controller der falsche Ort für solche Regex-Aktionen?

Antwort

44

ich Rubin tun regex'es auf diese Weise:

stringObj.match(/regex/) 
8

Es gibt auch

if @comment.content =~ /regex/ 

Wenn Sie ein Array aller bisherigen Kommentare @prev_comments hatte und wollte sie alle in einem Schuss ersetzen, Sie könnte:

pattern = /#(\d+)/ 

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

Trick Regexp.last_match wird mit dem aktuellen Spiel zu bekommen, die mich, wenn es sich fragen gemacht war threadsicher. Es scheint, is.

angepasst (gestohlen) von der unten allgemeinere String Erweiterung

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 

Quelle: http://vemod.net/string-js_replace

3

die Natur der .include passen?

stringObj.match(/regex/).present? 

Würden ähnliche wahr/falsch Ergebnisse geben, wenn Sie verwenden Rails (oder Active)

+0

Ruby-Match-Objekte haben keine 'vorhanden?'. – thundergolfer

+0

Aktualisiert, um festzustellen, dass Sie Rails oder ActiveSupport verwenden müssen, um Vorteile aus der Gegenwart zu ziehen? – Carpela

Verwandte Themen