rails7: jbuilder 的实践
我在项目中使用 jbuilder 的方法
通用的包装
handle_not_found_error
和handle_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 }