2015-12-14 3 views
0

У меня есть две регистрационные формы: одна, которая может регистрироваться на любом адресе электронной почты, а другая - только с одним конкретным доменом. Как разрешить это с модели User.rb?Проверка правильности электронной почты на основе паролей

Нечто подобное может работать:

validates_format_of :email, :with => /.io/ 

Но поскольку у меня есть две формы регистрации и URL для этой формы имеет идентификатор 2:

validates_format_of :email, :with => /.io/ if params[id] == 2 

Я понимаю, что params не является доступный в модели, но основанный на том, чего я хочу достичь, как это сделать?

В основном форма с id = 1 может регистрироваться с любым электронным адресом. Форма с id = 2 может регистрироваться только с адреса электронной почты .io.

ответ

1

Это звучит неплохо для использования в контексте проверки. Метод validates* может принимать параметр :on, который является именем «контекста», в котором будет активирована валидация; например:

validates_format_of :email, :with => /\.io\z/, on: :restricted_email 

Эта проверка будет срабатывать только если опция context: :restricted_email передается методу save или save!. Вот как вы можете использовать его в контроллере:

def create 
    @user = User.new(params[:user]) 

    if params[:id] == 2 
    @user.save!(context: :restricted_email) 
    else 
    @user.save! 
    end 
end 

Вот хороший блог на тему: http://blog.arkency.com/2014/04/mastering-rails-validations-contexts/

+0

Ошибка: 'Предоставленное регулярное выражение использует многострочные якоря (^ или $), что может представлять угрозу безопасности. Вы имели в виду использовать \ A и \ z или забыли добавить параметр: multiline => true? ' – Sylar

+0

Я отредактировал свой ответ, чтобы изменить' $ 'на' \ z'. –

+0

Jordon, последний вопрос. С вашим кодом, как легко добавить дополнительный домен в регулярное выражение? – Sylar

1

Вы можете добавить атрибут в модели, которая будет указывать на то, какую форму регистрации доносился из, как :registered_io, отправленного в модель через скрытое поле в форме

#... 
<%= f.hidden_field :registered_io, value="true" # or false %> 

Тогда в вашей модели вы можете просто do a

validates :format_of_io_email_should if self.registered_io 
validates :format_of_universal_email_should if !self.registered_io 

def format_of_io_email_should 
# regex ahoy or whatever 
end 
def format_of_universal_email_should 
# same same but different 
end 

Не забудьте запустить миграцию, чтобы сохранить атрибут тоже!

$ rails migration add_column_registered_io_to_user registered_io:boolean 

Также не забудьте разрешить: registered_io в сильных параметрах в контроллере.

+0

Это лучший вариант, на мой взгляд. Независимо от того, какие критерии вы используете для ограничения доступа к адресам электронной почты '.io', вы, вероятно, захотите сохранить этот контекст после создания пользователя. В противном случае у вас нет способа узнать, принадлежал ли существующий пользователь с адресом электронной почты '.io' к данной группе или нет. – meagar

+0

Я получаю 'undefined метод для зарегистрированного_to' из модели. – Sylar

+0

'registered_to' или' registered_io'? Заходите в '$ rails console', чтобы проверить это. – irbanana

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