Проверка параметров контроллера Rails методом сухой проверки - PullRequest
0 голосов
/ 13 ноября 2018

В первый раз я пытаюсь использовать сухой валидный камень.

Я хочу создать форму для нескольких моделей (Пользователь, Адрес, Компания)

Я решил использовать сухой валидатор, но не могу проверить форму. Я получаю ошибку валидатора ": user => [" должен быть хеш "]"

Как заставить это работать?

приложение / контроллер / users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
    @user.address = Address.new
    @user.company = Company.new
    @user.company.address = Address.new
  end

  def create
    @user = User.new
    validation = UserValidator::UserSchema.call(params)
    if validation.success?
      @user.attributes = validation.output[:user]
      @user.save
      redirect_to new_user_path, notice: 'Form send!'
    else
      redirect_to new_user_path, warning: "#{validation.errors}"
    end
 end
end

приложение / модели / user.rb

class User < ApplicationRecord
  has_one :company
  has_one :address, as: :addressable
  accepts_nested_attributes_for :company, :address
end

Приложение / валидаторов / user_validator

class UserValidator
  UserSchema = Dry::Validation.Params do
    required(:user).schema do
      required('first_name').filled
    end
  end
end

вывод параметров в действии создания:

<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>

1 Ответ

0 голосов
/ 18 мая 2019

dry-validation (и dry-схема) не принимает ActionController::Parameters, вы должны преобразовать его в хеш.

Попробуйте params.to_unsafe_hash или params.permit(...).to_h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...