ruby Rails的干验证在缺少参数时通过,在存在参数时产生错误

gopyfrb3  于 2023-05-17  发布在  Ruby
关注(0)|答案(1)|浏览(115)

在我的Rails 7应用程序中,我想使用dry-validation gem来验证MandateControllercreate方法中传入的JSON。基于这个JSON请求:

"sdd_setup_request": {
    "return_url": "https://example.com/return",
    "data": {
        (...)
    }
  }
}

我尝试使用验证器类验证它:

params do
    required(:sdd_setup_request).schema do
      required(:return_url).value(:string)
      required(:data).hash do
       (...)
      end
    end
  end
end

但是仍然得到一个错误sdd_setup_request is missing,当我在验证器类中将其更改为optional时,它将被传递。但是当我想测试其他验证是否有效并从JSON文件中删除return_url时,我应该得到一个缺少return_url的错误,但是验证会通过。
控制器类内部没有什么花哨的东西:

class MandatesController < BaseController
  def create
    result = SddRequestValidator.call(params)
    if result.success?
     (...)
    else
      render_error(result.errors.to_h, status: :bad_request)
    end
  end

我错过了什么?

[编辑]

# Gemfile.lock
dry-validation (1.10.0)

我也有initializers/dry_validator.rb

require 'dry/validation'

Dry::Validation.load_extensions(:monads)

父类ApplicationService如下:

class ApplicationService < Dry::Validation::Contract
  def self.call(*args)
    new.call(*args)
  end
end
f8rj6qna

f8rj6qna1#

我不确定这是否是一个问题,但如果你使用的是rails params方法,或者如果你使用的是强参数,那么在传递参数进行验证之前调用.to_h
例如,如果你有下面的方法

def user_params
  params.require(:user).permit(:name, :email)
end

像这样传递以上参数:result = UserSchema::CreateParams.call(user_params.to_h)

相关问题