Dry-validation przykład


#1

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?

Będę wdzięczny za pomoc i wskazówki.


#2

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.


#3

Użyłem tak:

app/validators/user_validator.rb

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

print params on create action

<ActionController::Parameters {"utf8"=>"✓","authenticity_token"=>"Dszr0k90aklK1NC4uGcemAl+yFa9ppMDo/gCLJt2wC1WjTgLC+NFebRqm6iqtVTnQzRgd7v0icntxETbxJ7v9g==", "user"=>{"first_name"=>"Test", "last_name"=>"asdasdasdasd", "email_address"=>"sadasdasd", "date_of_birth"=>"sdasda", "phone_number"=>"", "address_attributes"=>{"street"=>"dadadadsdad", "city"=>"asdasdad", "zip_code"=>"dasd", "country"=>"adsa"}, "company_attributes"=>{"name"=>"", "address_attributes"=>{"street"=>"", "city"=>"", "zip_code"=>"", "country"=>""}}}, "commit"=>"Submit", "controller"=>"users", "action"=>"create"} permitted: false>