Проверочный формат регулярных выражений, позволяющий вводить пробелы при удалении записи при сохранении записи - PullRequest
1 голос
/ 08 марта 2011

Следующее регулярное выражение проверяет номер телефона (хотя могло быть и другое), оставляя пробелы в конце:

validates :phone, 
          :presence => true,
          :format => {:with => /\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}[ ]*\z/}

Причина, по которой я хочу разрешить пробелы в конце, проста, потому что некоторые пользователи могут напечатать его по ошибке.

Что я хочу сделать, так это разрешить эти пробелы во время проверки, но при сохранении записи уберите все начальные / конечные пробелы. Таким образом, я могу позволить пользователю сделать небольшую «ошибку» (то есть пробелы в конце), но при этом сохранить «полностью допустимое» значение (в данном случае номер телефона), сохраненное в базе данных.

Можно ли это сделать автоматически (для любой модели, любого поля), чтобы мне не приходилось специально подрезать каждое поле перед его сохранением?

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Если вы делаете это только для нескольких полей, проще всего сделать это с помощью пользовательских сеттеров:

def phone_number=(val)
    self[:phone_number] = val.rstrip
end

Но если вам нужна более общая и удобная настройка, яЯ бы предложил написать расширение ActiveRecord - что-то вроде:

class ActiveRecord::Base
    def self.strips_trailing_spaces_from(*attrs)
        @@sts_attrs ||= []
        @@sts_attrs << attrs
        before_save :strip_trailing_spaces
    end

    def strip_trailing_spaces
        @@sts_attrs.each do |attr|
            val = self[attr]
            self[attr] = val.rstrip if val.is_a?(String)
        end
    end
end

И затем для каждой модели, которую вы хотите использовать, вы можете просто вызвать (стиль "макро" Rails):

class MyModel < ActiveRecord::Base

    strips_trailing_spaces_from :phone_number, :name, :pizza, :etc

    # ...classy stuff...
end

Примечание. Этот код не был протестирован, но он должен быть понятен.Надеюсь, это поможет!

0 голосов
/ 08 марта 2011
# strip leading and trailing whitespace in s
# ... simply:
s.strip!                   # modify s
s.strip                    # return modified string
# ... or with a regex
s.gsub!(/^\s+|\s+$/, '')   # modify s
s.gsub(/^\s+|\s+$/, '')    # return modified string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...