Cześć,
postanowiłem wypróbować wtyczkę dry-validation jako, że panuje opinia, że do gem must have.
Mam wątpliwości czy dobrze ją zaimplementowałem w projekcie (walidacja zagniezdzonych formularzy).
Czy ktoś pochwaliłby się swoim repozytorium z wykorzystaniem tego gema?
Zdecydowanie łatwiej będziesz jak wrzucisz kod jak to użyłeś niż szukać losowych przykładów z internetu. Wrzuć jakiś snippet(przerób tak żeby nie było 1:1 wyciągniete z danymi aplikacji) i wtedy się dowiesz czy jest OK czy nie.
class UserValidator
include ValidatorRegex
UserSchema = Dry::Validation.Params do
configure do
config.messages_file =
Rails.root.join('config', 'locales', 'validation_errors.en.yml')
def country?(value)
COUNTRY_LIST.include? value.to_s
end
def email?(value)
!EMAIL_REGEX.match(value).nil?
end
def correct_date?(value)
if !DATE_REGEX.match(value).nil?
Date.strptime(value, '%Y-%m-%d') < Time.zone.today
else
false
end
end
def phone?(value)
!PHONE_REGEX.match(value).nil?
end
def zip_code?(value)
!ZIP_CODE_REGEX.match(value).nil?
end
end
required(:user).schema do
required(:first_name).filled(max_size?: 100)
required(:last_name).filled(max_size?: 100)
required(:email_address).filled(:email?)
required(:date_of_birth).maybe(:correct_date?)
required(:phone_number).maybe(:phone?)
required(:address_attributes).schema do
required(:street).filled
required(:city).filled
required(:zip_code).filled(:zip_code?)
required(:country).filled(:country?)
end
required(:company_attributes).schema do
required(:name) { max_size?(200) }
required(:address_attributes).schema do
required(:street).maybe(:str?)
required(:city).maybe(:str?)
required(:zip_code).maybe(:zip_code?)
required(:country).maybe(:country?)
end
end
end
end
end
app/controllers/users_controller.rb
def create
@user = User.new
validation = UserValidator::UserSchema.with(record: @user)
.call(params.permit!.to_h)
if validation.success?
@user.attributes = validation.output[:user]
@user.save
redirect_to users_path, notice: 'Form send!'
else
redirect_to new_user_path, alert: validation.errors.to_s
end
end