2012-06-09 15 views
18

Sto lavorando su un meccanismo di quotatura nella mia app, dove dovrebbe essere possibile digitare semplicemente # 26, ad esempio, nel modulo di commento per citare il commento 26 di questo argomento.
Per verificare se un utente desidera citare uno o più commenti in primo luogo, inserisco una condizione if dopo il mio current_user.comments.build e prima di @ comment.save.
Ma, solo per fare la mia domanda un po 'più generale e più facile da adattare:Rails 3 - Verifica se stringa/testo include una determinata parola/carattere tramite regex nel controller

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

voglio qualcosa di simile. Quell'esempio era per verificare se il contenuto del commento include e-mail. Ma logicamente ottengo un errore "impossibile convertire regexp in stringa".

Come si può fare l'inclusione? metodo in rotaie con un regexp? Quindi, per verificare se un testo include una stringa di un certo formato regex?

Oppure il controller è il posto sbagliato per tali azioni regex?

risposta

44

faccio rubino regex'es questo modo:

stringObj.match(/regex/) 
8

C'è anche

if @comment.content =~ /regex/ 

Se tu avessi un array di tutti i commenti @prev_comments precedenti e si vuole sostituire tutti in un solo colpo, si potrebbe:

pattern = /#(\d+)/ 

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

trucco è utilizzato Regexp.last_match per ottenere la corrispondenza corrente, che mi ha fatto chiedo se era thread sicuro. È is, apparentemente.

adattato (rubato) dall'estensione sotto più generale 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 

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

3

per abbinare la natura del .include?

stringObj.match(/regex/).present? 

Otterrà simili veri falsi risultati/se si sta utilizzando Rails (o ActiveSupport)

+0

Rubino partita oggetti non hanno 'presente?'. – thundergolfer

+0

Aggiornato per notare che è necessario utilizzare Rails o ActiveSupport per sfruttare il presente? – Carpela

Problemi correlati