2015-12-16 1 views
0

Я пытаюсь написать код, который позволит мне искать содержимое, отправленное через форму, и найти адрес электронной почты в контенте. Ниже приведен код и сообщение об ошибке, которое я получаю.Поиск строки для поиска адреса электронной почты в ruby ​​

Error: undefined method `match' for {"content"=>"this is a test [email protected]"}:ActionController::Parameters 

Код:

class ChallengesController < ApplicationController 
    def create 
    @challenge = current_user.challenges.build(challenge_params) 
    challenge_params.match(/\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b/i) 
    # ... 
    end 

    private 

    def challenge_params 
    params.require(:challenge).permit(:content) 
    end 
end 
+0

Что ваш вопрос? – sawa

+1

Использование регулярных выражений для поиска действительных строк электронной почты очень сложно, потому что существует [огромное количество вариантов действительных адресов] (http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate -an-электронный-адрес). –

ответ

1

Вы подаете match на Hash.

challenge_params является хэш. Судя по сообщению об ошибке, это хэш содержит ключ content который где вы хотите использовать с match, следовательно, переписыванием match строку:

challenge_params["content"].match(/\b[A-Z0-9\._%+-][email protected][A-Z0-9\.-]+\.[A-Z]{2,4}\b/i) 
+1

Кроме того, регулярное выражение неверно - '.' должно быть экранировано как в' [] '. – BroiSatse

+0

не заметил это. Спасибо, обновит его в моем ответе – shivam

+3

@BroiSatse это неправильно. Dot * не требует экранирования внутри квадратных скобок. – mudasobwa

0

Я новичок в рубина, так что мой ответ может быть очень «любительским -ish ", но иногда самые простые идеи являются лучшими ... То, как я это сделаю, это поиск индекса знака @. Затем проанализируйте каждый символ до и после знака, пока не получите пустое пространство и сохраните эти индексные числа. Используйте эти индексные номера, чтобы извлечь адрес электронной почты из своей строки.

def email_address(str) 
at_index = str.index('@') 
temp = (at_index - 1) 
while str[temp] != ' ' 
    temp -= 1 
end 
begining_index = (temp + 1) 
temp = (at_index + 1) 
while str[temp] != ' ' 
    temp += 1 
end 
end_index = temp 
return str[begining_index..end_index] 

конец

+1

Проблема с этим подходом заключается в том, что если вы получите строку типа: '' некоторые случайные специальные символы 1 @ # $%! Мой адрес электронной почты: [email protected] "' – shivam

+0

Пока описание хорошее, вам нужно показать код. Мы ценим, что вы новичок в Ruby, однако решения проблем почти всегда требуют кода. –

+0

@theTinMan: извините за это. Я редактировал свой оригинальный ответ, включая пример кода ... – Margal

Смежные вопросы