rails7: jbuilder 的实践

我在项目中使用 jbuilder 的方法
更新于: 2023-12-10 16:18:01

通用的包装

handle_not_found_errorhandle_internal_error 效果是一样的

class ApplicationController < ActionController::Base
  around_action :wrap
  rescue_from StandardError, with: :handle_internal_error
  rescue_from ActiveRecord::RecordNotFound, with: :handle_not_found_error
	
  # ... 省略10000行代码

  private

  def wrap
    yield
    render 'api/v1/base' unless performed?
  end

  def handle_internal_error(exception)
    logger.error exception.message
    logger.error exception.backtrace.join("\n")
    @message = exception.message
    @status = 500
    render 'api/v1/base'
  end

  def handle_not_found_error(exception)
    logger.error exception.message
    logger.error exception.backtrace.join("\n")
    wrap do
      @message = exception.message
      @status = 404
    end
  end
end

通用的view

所有 wrap 公用的 jbuilder 模板

# api/v1/base.json.jbuilder
# set default status 200
# set default message nil

json.data @data if defined?(@data)
json.status @status || 200
json.message @message || nil

一个 json API 的实现

只要使用 wrap 这个 yield 方法即可

class TagsController < ApplicationController
  def index
    wrap {
      @data = Tag.all
    }
  end

  def show
    wrap {
      @data = Tag.find(params[:id])
    }
  end
end

路由

resources :tags, only: [:index, :show], defaults: { format: :json }

参考