rails_warp 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +69 -1
- data/lib/rails_warp/engine.rb +21 -8
- data/lib/rails_warp/jbuilder_extension.rb +31 -44
- data/lib/rails_warp/version.rb +1 -1
- data/lib/rails_warp.rb +1 -1
- metadata +2 -11
- data/app/assets/stylesheets/rails_warp/application.css +0 -15
- data/app/controllers/rails_warp/application_controller.rb +0 -4
- data/app/helpers/rails_warp/application_helper.rb +0 -4
- data/app/jobs/rails_warp/application_job.rb +0 -4
- data/app/mailers/rails_warp/application_mailer.rb +0 -6
- data/app/models/rails_warp/application_record.rb +0 -5
- data/app/views/layouts/rails_warp/application.html.erb +0 -17
- data/config/routes.rb +0 -2
- data/lib/tasks/rails_warp_tasks.rake +0 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1f452c034dbc05ef83d21fd52ff01303300853afae27de972ac371ad8d103fd1
|
|
4
|
+
data.tar.gz: 81cfb7742946d346711609acc8ab6eb6709d15c92f8d827a2f220b3f3ac67e55
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e2a0e7d7f2bf27813840b88d1ee983fc21bc40a07a62529cdabe45d8a3f2474db87b59032cad08d5d16d7e956c844845b926bf6ed29acf8302462e5deb338109
|
|
7
|
+
data.tar.gz: fe0c8e021d1012fe84e61636a42a0f7962bdb46b58e13eca820a3453fd98e0651feb602e68620350c1f72a0ce54d565ea45a3affe60eb172bf25505470767ef3
|
data/README.md
CHANGED
|
@@ -2,7 +2,75 @@
|
|
|
2
2
|
> A Rails plugin for elegant, hash-based response wrapper for clean Rails API responses.
|
|
3
3
|
|
|
4
4
|
## Usage
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
RailsWarp is automatically included into ActionController and Jbuilder. You don\u2019t need to include any module manually.
|
|
7
|
+
|
|
8
|
+
- Controllers: call ok and fail directly.
|
|
9
|
+
|
|
10
|
+
Basic controller examples:
|
|
11
|
+
|
|
12
|
+
```ruby
|
|
13
|
+
class UsersController < ApplicationController
|
|
14
|
+
def show
|
|
15
|
+
user = User.find(params[:id])
|
|
16
|
+
ok data: { user: user }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def create
|
|
20
|
+
user = User.new(user_params)
|
|
21
|
+
if user.save
|
|
22
|
+
ok data: { user: user }, message: "created", code: 201
|
|
23
|
+
else
|
|
24
|
+
fail message: "validation error", code: 422, data: { errors: user.errors.full_messages }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Add extra fields (merged into the response):
|
|
31
|
+
|
|
32
|
+
```ruby
|
|
33
|
+
ok data: { user: user }, meta: { request_id: request.request_id }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
HTTP status mapping:
|
|
37
|
+
- 200, 201, 204: returned as-is
|
|
38
|
+
- 400: bad_request
|
|
39
|
+
- 401: unauthorized
|
|
40
|
+
- 403: forbidden
|
|
41
|
+
- 404: not_found
|
|
42
|
+
- 422: unprocessable_entity
|
|
43
|
+
- 500: internal_server_error
|
|
44
|
+
|
|
45
|
+
Global error handling example:
|
|
46
|
+
|
|
47
|
+
```ruby
|
|
48
|
+
class ApplicationController < ActionController::Base
|
|
49
|
+
rescue_from ActiveRecord::RecordNotFound do |e|
|
|
50
|
+
fail message: e.message, code: 404
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
rescue_from StandardError do |e|
|
|
54
|
+
fail message: "internal error", code: 500, data: { error: e.class.name }
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Jbuilder usage (already mixed in, call ok/fail inside templates):
|
|
60
|
+
|
|
61
|
+
```ruby
|
|
62
|
+
# app/views/users/show.json.jbuilder
|
|
63
|
+
json.ok data: { user: { id: @user.id, name: @user.name } }, message: "ok"
|
|
64
|
+
|
|
65
|
+
# app/views/shared/error.json.jbuilder
|
|
66
|
+
json.fail message: "not found", code: 404, data: { resource: "User" }
|
|
67
|
+
|
|
68
|
+
# extra fields
|
|
69
|
+
json.ok data: { list: @items.map { |i| { id: i.id, name: i.name } } }, meta: { total: @items.count }
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Aliases in Jbuilder: you can also use `json.warp_ok` and `json.warp_fail`.
|
|
73
|
+
|
|
6
74
|
|
|
7
75
|
## Installation
|
|
8
76
|
Add this line to your application's Gemfile:
|
data/lib/rails_warp/engine.rb
CHANGED
|
@@ -11,16 +11,29 @@ module RailsWarp
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
# 将 Jbuilder 扩展模块包含到 Jbuilder 类中
|
|
14
|
-
|
|
15
|
-
#
|
|
16
|
-
|
|
14
|
+
initializer "rails_warp.jbuilder", before: :eager_load! do |app|
|
|
15
|
+
# 显式 require jbuilder 以确保 handler 被注册
|
|
16
|
+
require 'jbuilder'
|
|
17
|
+
|
|
18
|
+
# 确保 jbuilder handler 被注册
|
|
19
|
+
if defined?(JbuilderHandler) && !ActionView::Template.registered_template_handler(:jbuilder)
|
|
20
|
+
ActionView::Template.register_template_handler(:jbuilder, JbuilderHandler)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# 将 JbuilderExtension 包含到 Jbuilder 类
|
|
17
24
|
if defined?(Jbuilder)
|
|
18
|
-
Jbuilder.include
|
|
25
|
+
Jbuilder.include(RailsWarp::JbuilderExtension)
|
|
19
26
|
end
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
|
|
28
|
+
# 某些版本的 jbuilder 使用 Jbuilder::Template
|
|
29
|
+
if defined?(Jbuilder::Template)
|
|
30
|
+
Jbuilder::Template.include(RailsWarp::JbuilderExtension)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# 兼容旧版本的 JbuilderTemplate
|
|
34
|
+
if defined?(JbuilderTemplate) && defined?(JbuilderTemplate) != defined?(Jbuilder::Template)
|
|
35
|
+
JbuilderTemplate.include(RailsWarp::JbuilderExtension)
|
|
23
36
|
end
|
|
24
37
|
end
|
|
25
38
|
end
|
|
26
|
-
end
|
|
39
|
+
end
|
|
@@ -1,58 +1,45 @@
|
|
|
1
1
|
# lib/rails_warp/jbuilder_extension.rb
|
|
2
2
|
module RailsWarp
|
|
3
3
|
module JbuilderExtension
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
# 忽略方法_missing 中的特定方法名
|
|
5
|
+
# 我们需要覆盖 method_missing 来拦截这些调用
|
|
6
|
+
def method_missing(method_name, *args, &block)
|
|
7
|
+
if method_name == :warp_ok || method_name == :ok
|
|
8
|
+
_warp_ok(*args, &block)
|
|
9
|
+
elsif method_name == :warp_fail || method_name == :fail
|
|
10
|
+
_warp_fail(*args, &block)
|
|
11
|
+
else
|
|
12
|
+
super
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def respond_to_missing?(method_name, include_private = false)
|
|
17
|
+
method_name == :warp_ok || method_name == :ok ||
|
|
18
|
+
method_name == :warp_fail || method_name == :fail || super
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def _warp_ok(**options)
|
|
7
24
|
message = options[:message] || "success"
|
|
8
25
|
code = options[:code] || 200
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
26
|
+
|
|
27
|
+
set! :success, true
|
|
28
|
+
set! :code, code
|
|
29
|
+
set! :message, message
|
|
30
|
+
|
|
31
|
+
yield if block_given?
|
|
13
32
|
end
|
|
14
33
|
|
|
15
|
-
|
|
16
|
-
def warp_fail(**options)
|
|
34
|
+
def _warp_fail(**options)
|
|
17
35
|
message = options[:message] || "error"
|
|
18
36
|
code = options[:code] || 500
|
|
19
|
-
data = options[:data]
|
|
20
|
-
# 构建响应哈希
|
|
21
|
-
response_hash = build_response(false, data, message, code, **options.except(:data, :message, :code))
|
|
22
|
-
# 将响应哈希的内容合并到当前 jbuilder 对象
|
|
23
|
-
merge!(response_hash)
|
|
24
|
-
end
|
|
25
37
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
set! :success, false
|
|
39
|
+
set! :code, code
|
|
40
|
+
set! :message, message
|
|
29
41
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# 内部构建响应体的辅助方法
|
|
33
|
-
def build_response(success, data, message, code, **extra)
|
|
34
|
-
response_hash = {
|
|
35
|
-
success: success,
|
|
36
|
-
code: code,
|
|
37
|
-
message: message,
|
|
38
|
-
data: data # <--- 修改这里:明确写成 data: data
|
|
39
|
-
}
|
|
40
|
-
# 合并额外的字段
|
|
41
|
-
response_hash.merge!(extra) if extra.present?
|
|
42
|
-
response_hash
|
|
42
|
+
yield if block_given?
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
|
-
|
|
47
|
-
# Rails 应用启动时,将 JbuilderExtension 混入到 Jbuilder 的上下文
|
|
48
|
-
# Rails.application.config.after_initialize do
|
|
49
|
-
# # Jbuilder 的上下文类通常是 Jbuilder 或 JbuilderTemplate
|
|
50
|
-
# # 尝试混入到 Jbuilder 类
|
|
51
|
-
# if defined?(Jbuilder)
|
|
52
|
-
# Jbuilder.include RailsWarp::JbuilderExtension
|
|
53
|
-
# end
|
|
54
|
-
# # 如果 JbuilderTemplate 存在,也混入它 (在某些 Jbuilder 版本中可能需要)
|
|
55
|
-
# if defined?(JbuilderTemplate)
|
|
56
|
-
# JbuilderTemplate.include RailsWarp::JbuilderExtension
|
|
57
|
-
# end
|
|
58
|
-
# end
|
data/lib/rails_warp/version.rb
CHANGED
data/lib/rails_warp.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rails_warp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- aric.zheng
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-02-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jbuilder
|
|
@@ -35,20 +35,11 @@ files:
|
|
|
35
35
|
- MIT-LICENSE
|
|
36
36
|
- README.md
|
|
37
37
|
- Rakefile
|
|
38
|
-
- app/assets/stylesheets/rails_warp/application.css
|
|
39
|
-
- app/controllers/rails_warp/application_controller.rb
|
|
40
|
-
- app/helpers/rails_warp/application_helper.rb
|
|
41
|
-
- app/jobs/rails_warp/application_job.rb
|
|
42
|
-
- app/mailers/rails_warp/application_mailer.rb
|
|
43
|
-
- app/models/rails_warp/application_record.rb
|
|
44
|
-
- app/views/layouts/rails_warp/application.html.erb
|
|
45
|
-
- config/routes.rb
|
|
46
38
|
- lib/rails_warp.rb
|
|
47
39
|
- lib/rails_warp/engine.rb
|
|
48
40
|
- lib/rails_warp/jbuilder_extension.rb
|
|
49
41
|
- lib/rails_warp/response_wrapper.rb
|
|
50
42
|
- lib/rails_warp/version.rb
|
|
51
|
-
- lib/tasks/rails_warp_tasks.rake
|
|
52
43
|
homepage: https://github.com/afeiship/rails_warp
|
|
53
44
|
licenses:
|
|
54
45
|
- MIT
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
|
3
|
-
* listed below.
|
|
4
|
-
*
|
|
5
|
-
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
|
6
|
-
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
|
7
|
-
*
|
|
8
|
-
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
|
9
|
-
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
|
10
|
-
* files in this directory. Styles in this file should be added after the last require_* statement.
|
|
11
|
-
* It is generally better to create a new file per style scope.
|
|
12
|
-
*
|
|
13
|
-
*= require_tree .
|
|
14
|
-
*= require_self
|
|
15
|
-
*/
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<title>Rails warp</title>
|
|
5
|
-
<%= csrf_meta_tags %>
|
|
6
|
-
<%= csp_meta_tag %>
|
|
7
|
-
|
|
8
|
-
<%= yield :head %>
|
|
9
|
-
|
|
10
|
-
<%= stylesheet_link_tag "rails_warp/application", media: "all" %>
|
|
11
|
-
</head>
|
|
12
|
-
<body>
|
|
13
|
-
|
|
14
|
-
<%= yield %>
|
|
15
|
-
|
|
16
|
-
</body>
|
|
17
|
-
</html>
|
data/config/routes.rb
DELETED