Я хочу, чтобы пароль был обязательным только для веб-регистрации, а не для регистрации мобильного приложения. Мой код проверки ниже:

  class User < ApplicationRecord
    validate :password_for_web
    validate :password_confirmation_for_web

  def password_for_web
    if  !app_user && password.blank? 
    errors.add(:password, "can't be blank.")
  end
end

 def password_confirmation_for_web
   if  !app_user && password != self.password_confirmation=
       errors.add(:password_confirmation, "doesn't match.")
   end
 end

 end

Проверка работает правильно, но когда в случае регистрации мобильного приложения все еще требуется пароль. Помощь по этому вопросу была бы полезна.

0
Kamran Ali 10 Фев 2020 в 10:56

2 ответа

Лучший ответ

Вы можете использовать опции if: и unless: для переключения валидации:

class User < ApplicationRecord
  validates :password, presence: true, confirmation: true, unless: :app_user?
  # or 
  validates :password, presence: true, confirmation: true, if: :web_user?

  # TODO implement app_user?
end

Вы можете передать символ (имя метода) или лямбду.

0
max 10 Фев 2020 в 23:30

Если вы используете простое приложение rails с адаптивным дизайном.

Вы должны сначала проверить устройство мобильное или другое устройство. Это вы можете сделать разными способами.

Пользовательский способ:

В application_helper.rb:

def mobile_device
  agent = request.user_agent
  return "tablet" if agent =~ /(tablet|ipad)|(android(?!.*mobile))/i
  return "mobile" if agent =~ /Mobile/
  return "desktop"
end

Тогда вы можете использовать его в своих взглядах:

<% if mobile_device == "mobile" %>
    //add extra parameter to check in model
    <% form_tag :mobile_device, true %>
<% end %>

В вашей модели:

class User < ApplicationRecord
  validate :password_for_web, if: :mobile_device?
  validate :password_confirmation_for_web, if: :mobile_device?

  def password_for_web
    if  !app_user && password.blank? 
        errors.add(:password, "can't be blank.")
    end
  end

  def password_confirmation_for_web
    if  !app_user && password != self.password_confirmation=
    errors.add(:password_confirmation, "doesn't match.")
    end
  end

  def mobile_device?
    mobile_device.present?
  end
end

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

https://github.com/fnando/browser

https://github.com/shenoudab/active_device

Если у вас есть отдельное мобильное приложение.

Добавьте дополнительный параметр в форму регистрации для мобильного приложения, как я использовал в своем представлении с именем mobile_device. Используйте обновленный код модели, и все готово.

0
Dipak Gupta 10 Фев 2020 в 08:22