Use Tipos no Rails para validações de modelos personalizados

# In Gemfile...
gem
'virtus'
gem
'validates' # custom email validations

# In app/types/user_sign_in_type.rb
class UserSignInType
include
ActiveModel::Validations
include
ActiveModel::Conversion
include
Virtus

attribute
:email, String
attribute
:password, String

validates
:email, presence: true, email: true
validates
:password, presence: true

validates_each
:email do |record, attr, value|
if !user.try(:authenticate, record.password)
record
.errors.add(attr, :user_or_password_invalid)
end
end

def persisted?
false
end

def user
@user ||= User.find_by_email(email)
end
end

# In your controller...

def new
@type = UserSignInType.new
end

def create
@type = UserSignInType.new(params[:user_sign_in_type])

if @type.valid?
user
= @type.user
flash_success

sign_in
(user)
redirect_to root_path

else
render
:new
end
end