2012-06-09 6 views
18

Pracuję nad mechanizmem cytowania w mojej aplikacji, gdzie powinno być możliwe po prostu wpisanie # 26, na przykład, w formularzu komentarza w celu zacytowania komentarza 26 tego tematu.
Aby sprawdzić, czy użytkownik chce zacytować jeden lub więcej komentarzy, umieszczam warunek if po moim current_user.comments.build i before @ comment.save.
Ale tylko, aby moje pytanie nieco bardziej ogólny i łatwiejsze do przystosowania:Szyny 3 - Sprawdź, czy ciąg/tekst zawiera określone słowo/znak poprzez wyrażenie regularne w kontrolerze

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

chcę coś takiego. Ten przykład służy do sprawdzania, czy treść komentarza obejmuje wiadomości e-mail. Ale logicznie otrzymuję komunikat "nie można przekonwertować wyrażeń regularnych na ciąg".

Jak można dołączyć? metoda w szynach z wyrażeniem regularnym? Tak więc, aby sprawdzić, czy tekst zawiera ciąg określonego formatu regex?

Czy kontroler jest niewłaściwym miejscem do wykonywania takich działań?

Odpowiedz

44

zrobić rubin regex'es ten sposób:

stringObj.match(/regex/) 
8

Jest też

if @comment.content =~ /regex/ 

Jeśli miał tablicę wszystkich poprzednich komentarzy @prev_comments i chciał wymienić je wszystkie w jednym ujęciu, można:

pattern = /#(\d+)/ 

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

Sztuczka korzysta Regexp.last_match aby uzyskać aktualny mecz, co sprawiło, że zastanawiam się, czy to był bezpieczny dla wątków. Najprawdopodobniej jest to is.

przystosowane (skradziony) od poniżej bardziej ogólnego rozszerzenia 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 

Źródło: http://vemod.net/string-js_replace

3

Aby dopasować charakter .include?

stringObj.match(/regex/).present? 

dałoby podobne wyniki prawda/fałsz, jeśli używasz Rails (lub ActiveSupport)

+0

Ruby obiektów meczu nie mają 'obecny?'. – thundergolfer

+0

Zaktualizowany, aby pamiętać, że musisz korzystać z Railsów lub ActiveSupport, aby wykorzystać teraźniejszość? – Carpela