Class: RailsApiBase::BaseController

Inherits:
ActionController::API
  • Object
show all
Includes:
BlueprintOptionsSupport, Queryable
Defined in:
app/controllers/rails_api_base/base_controller.rb

Constant Summary

Constants included from Queryable

Queryable::DEFAULT_CONFIG

Instance Method Summary collapse

Methods included from BlueprintOptionsSupport

#blueprint_options

Instance Method Details

#after_create(resource) ⇒ Object



81
# File 'app/controllers/rails_api_base/base_controller.rb', line 81

def after_create(resource); end

#after_save(resource) ⇒ Object



75
76
77
# File 'app/controllers/rails_api_base/base_controller.rb', line 75

def after_save(resource)
  action_name == "create" ? after_create(resource) : after_update(resource)
end

#after_update(resource) ⇒ Object



84
# File 'app/controllers/rails_api_base/base_controller.rb', line 84

def after_update(resource); end

#before_create(resource) ⇒ Object

子类覆盖这些 ===



80
# File 'app/controllers/rails_api_base/base_controller.rb', line 80

def before_create(resource); true; end

#before_save(resource) ⇒ Object

可选:通用钩子(默认调用 create/update 钩子)===



71
72
73
# File 'app/controllers/rails_api_base/base_controller.rb', line 71

def before_save(resource)
  action_name == "create" ? before_create(resource) : before_update(resource)
end

#before_update(resource) ⇒ Object



83
# File 'app/controllers/rails_api_base/base_controller.rb', line 83

def before_update(resource); true; end

#createObject



49
50
51
52
53
54
55
56
57
58
# File 'app/controllers/rails_api_base/base_controller.rb', line 49

def create
  resource = resource_class.new(resource_params)
  if before_save(resource) && resource.save
    after_save(resource)
    data = serialize_resource(resource)
    render_success(data, status: :created, message: "Created successfully")
  else
    render_error(message: "Validation failed", errors: resource.errors.full_messages)
  end
end

#destroyObject



86
87
88
89
# File 'app/controllers/rails_api_base/base_controller.rb', line 86

def destroy
  resource.destroy
  render_success(nil, message: "Deleted successfully")
end

#indexObject



35
36
37
38
39
40
41
42
# File 'app/controllers/rails_api_base/base_controller.rb', line 35

def index
  result = apply_query_with_meta(collection)
  data = {
    query_config[:meta][:rows_key] => serialize_collection(result[:collection]),
  }
  data.merge!(result[:meta]) if result[:meta]
  render_success(data)
end

#render_error(message: "Unprocessable Entity", status: :unprocessable_entity, errors: nil) ⇒ Object

统一错误响应 ===



17
18
19
20
# File 'app/controllers/rails_api_base/base_controller.rb', line 17

def render_error(message: "Unprocessable Entity", status: :unprocessable_entity, errors: nil)
  code = response_code_for(action_name, status: status)
  render json: { code: code, msg: message, errors: errors }, status: status
end

#render_success(data, status: :ok, message: "success", code: nil) ⇒ Object

统一成功响应 ===



11
12
13
14
# File 'app/controllers/rails_api_base/base_controller.rb', line 11

def render_success(data, status: :ok, message: "success", code: nil)
  code ||= response_code_for(action_name, status: status)
  render json: { code: code, msg: message, data: data }, status: status
end

#response_code_for(action, **context) ⇒ Object

允许子类自定义响应 code ===



23
24
25
26
27
28
29
30
# File 'app/controllers/rails_api_base/base_controller.rb', line 23

def response_code_for(action, **context)
  status = context[:status] || :ok
  if status.is_a?(Integer)
    status
  else
    Rack::Utils::SYMBOL_TO_STATUS_CODE.fetch(status, 200)
  end
end

#showObject



44
45
46
47
# File 'app/controllers/rails_api_base/base_controller.rb', line 44

def show
  data = serialize_resource(resource)
  render_success(data)
end

#updateObject



60
61
62
63
64
65
66
67
68
# File 'app/controllers/rails_api_base/base_controller.rb', line 60

def update
  if before_save(resource) && resource.update(resource_params)
    after_save(resource)
    data = serialize_resource(resource)
    render_success(data, message: "Updated successfully")
  else
    render_error(message: "Validation failed", errors: resource.errors.full_messages)
  end
end