Rails 6下rswag自动生成示例失效及请求体Schema生成问题
Rails 6 rswag API文档化问题解决
问题1:自动生成示例功能不生效
已确认解决方案:关闭rswag默认的空跑模式即可,执行命令替换为:SWAGGER_DRY_RUN=0 RAILS_ENV=test rails rswag
无需使用原命令RAILS_ENV=test rails rswag。
问题2:请求体Schema自动生成实现
rswag本身不内置请求体Schema自动生成能力,可以通过以下方案自行实现:
- 方案1:基于ActiveRecord模型元数据生成
适合请求参数和模型字段对应度高的场景,步骤如下:- 在
spec/swagger_helper.rb中新增工具方法:
- 在
# 根据ActiveRecord模型自动生成请求体Schema def generate_request_schema(model_class, exclude_fields = %w[id created_at updated_at deleted_at]) # 提取模型字段,排除不需要暴露的字段 columns = model_class.columns_hash.except(*exclude_fields) # 生成字段类型映射 properties = columns.each_with_object({}) do |(name, column), hash| type = case column.type when :integer then 'integer' when :string, :text then 'string' when :boolean then 'boolean' when :datetime, :date then 'string' when :float, :decimal then 'number' else 'string' end hash[name.to_sym] = { type: type } end # 自动提取必填字段(基于模型的presence校验规则) required_fields = model_class.validators .select { |v| v.is_a? ActiveRecord::Validations::PresenceValidator } .map(&:attributes) .flatten .map(&:to_sym) { type: :object, properties: properties, required: required_fields } end
- 在接口定义中直接调用方法,无需手动编写Schema结构:
parameter name: :book, in: :body, schema: generate_request_schema(Book)
如果有自定义字段需要调整,可传入第二个参数排除不需要的字段,或者对生成的Schema做追加修改即可。
- 方案2:基于参数校验规则生成
如果项目使用了dry-validation等参数校验gem,或者有统一的强参数白名单配置,可以直接从校验规则/白名单中提取允许的字段和类型,生成对应的Schema结构,实现和业务参数规则的同步。
额外注意:你现有测试代码中POST接口的路径定义缺开头的
/,应修正为path '/api/v1/books',否则生成的swagger.json路径会异常,影响文档展示。
内容的提问来源于stack exchange,提问作者mark.sack
相关产品推荐
相关产品推荐

