turboboost 0.0.8 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +10 -10
- data/README.md +26 -7
- data/app/assets/javascripts/turboboost.js.coffee +19 -8
- data/lib/turboboost.rb +14 -6
- data/lib/turboboost/version.rb +1 -1
- data/turboboost.gemspec +5 -5
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fbdb36ff6054cee71ee37b77fa106f9b581da49
|
4
|
+
data.tar.gz: c7cd477b42b90defe122a8003d026da47a8463f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4dad87536b15bcd6f9f7a5f882b4fd5257683371d9a3bb78ca837172d16efc9643671ecfd2797cd78f553cdbbaacf193bd3ab0f703861adeff09a08f628b8d82
|
7
|
+
data.tar.gz: 56a37fa040c88c52e94d3ca4e3894fcd39602594c933708abe67f8541b424032868af6b1dee44bb4f39c9712bf7111c34d1a3aae601cad35cb19f40c001d4ad6
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
turboboost (0.0.
|
4
|
+
turboboost (0.0.10)
|
5
5
|
coffee-rails
|
6
6
|
jquery-rails
|
7
7
|
railties
|
@@ -40,18 +40,18 @@ GEM
|
|
40
40
|
arel (5.0.1.20140414130214)
|
41
41
|
awesome_print (1.2.0)
|
42
42
|
builder (3.2.2)
|
43
|
-
coffee-rails (4.0
|
43
|
+
coffee-rails (4.1.0)
|
44
44
|
coffee-script (>= 2.2.0)
|
45
45
|
railties (>= 4.0.0, < 5.0)
|
46
|
-
coffee-script (2.
|
46
|
+
coffee-script (2.3.0)
|
47
47
|
coffee-script-source
|
48
48
|
execjs
|
49
|
-
coffee-script-source (1.
|
49
|
+
coffee-script-source (1.8.0)
|
50
50
|
erubis (2.7.0)
|
51
|
-
execjs (2.
|
51
|
+
execjs (2.2.2)
|
52
52
|
hike (1.2.3)
|
53
53
|
i18n (0.6.9)
|
54
|
-
jquery-rails (3.1.
|
54
|
+
jquery-rails (3.1.2)
|
55
55
|
railties (>= 3.0, < 5.0)
|
56
56
|
thor (>= 0.14, < 2.0)
|
57
57
|
json (1.8.1)
|
@@ -83,7 +83,7 @@ GEM
|
|
83
83
|
activesupport (= 4.1.0)
|
84
84
|
rake (>= 0.8.7)
|
85
85
|
thor (>= 0.18.1, < 2.0)
|
86
|
-
rake (
|
86
|
+
rake (0.9.6)
|
87
87
|
sprockets (2.12.1)
|
88
88
|
hike (~> 1.2)
|
89
89
|
multi_json (~> 1.0)
|
@@ -93,14 +93,14 @@ GEM
|
|
93
93
|
actionpack (>= 3.0)
|
94
94
|
activesupport (>= 3.0)
|
95
95
|
sprockets (~> 2.8)
|
96
|
-
sqlite3 (1.3.
|
96
|
+
sqlite3 (1.3.10)
|
97
97
|
thor (0.19.1)
|
98
98
|
thread_safe (0.3.3)
|
99
99
|
tilt (1.4.1)
|
100
100
|
treetop (1.4.15)
|
101
101
|
polyglot
|
102
102
|
polyglot (>= 0.3.1)
|
103
|
-
turbolinks (2.
|
103
|
+
turbolinks (2.5.2)
|
104
104
|
coffee-rails
|
105
105
|
turn (0.9.6)
|
106
106
|
ansi
|
@@ -115,7 +115,7 @@ DEPENDENCIES
|
|
115
115
|
bundler (~> 1.3)
|
116
116
|
mocha
|
117
117
|
rails (>= 3.2, < 5)
|
118
|
-
rake
|
118
|
+
rake (~> 0)
|
119
119
|
sqlite3
|
120
120
|
turboboost!
|
121
121
|
turn
|
data/README.md
CHANGED
@@ -32,9 +32,7 @@ or add the data attribute manually:
|
|
32
32
|
<form data-turboboost> ...
|
33
33
|
```
|
34
34
|
|
35
|
-
###
|
36
|
-
|
37
|
-
#### Redirection with Turbolinks
|
35
|
+
### Redirection with Turbolinks
|
38
36
|
|
39
37
|
In its simplest server-side implementation, a basic Turboboost controller action with redirection might look like this:
|
40
38
|
|
@@ -47,7 +45,9 @@ end
|
|
47
45
|
|
48
46
|
If the post is successfully created through a Turboboost-ed form, the app will visit the post's URL with Turbolinks. Otherwise, the redirect will happen like normal.
|
49
47
|
|
50
|
-
|
48
|
+
If a Turboboost form makes a GET request, it will serialize the form's data and then visit its action URL with the data serialized as parameters with Turbolinks.
|
49
|
+
|
50
|
+
### Error handling
|
51
51
|
|
52
52
|
If the post in our example above is invalid, no redirect will happen and a `rescue_from` handler will pass the errors to JavaScript through the `turboboost:error` event:
|
53
53
|
|
@@ -73,6 +73,8 @@ def create
|
|
73
73
|
end
|
74
74
|
```
|
75
75
|
|
76
|
+
#### Automatic error message insertion
|
77
|
+
|
76
78
|
Optionally, Turboboost can render returned errors with the same HTML structure used in the default Rails generators and prepend it to the form. The HTML structure looks like this:
|
77
79
|
|
78
80
|
``` html
|
@@ -91,7 +93,24 @@ To turn it on:
|
|
91
93
|
Turboboost.insertErrors = true
|
92
94
|
```
|
93
95
|
|
94
|
-
|
96
|
+
By default, this will prepend the error message to the form. Other values can be "append", "beforeSubmit", "afterSubmit", or any jQuery selector within the form:
|
97
|
+
|
98
|
+
``` coffeescript
|
99
|
+
Turboboost.insertErrors = '.error-wrap'
|
100
|
+
```
|
101
|
+
|
102
|
+
#### Error internationalization
|
103
|
+
|
104
|
+
Currently Turboboost will handle invalid `ActiveRecord` and `ActiveModel` error messages as well as basic HTTP error messages. For ActiveRecord validations, it will use [Rails' I18n lookup](http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models) to retrieve the message wording. For other raised exceptions, you can customize the basic wording using the I18n namespace format `turboboost.errors.#{error.class.name}`:
|
105
|
+
|
106
|
+
``` yaml
|
107
|
+
en:
|
108
|
+
turboboost:
|
109
|
+
errors:
|
110
|
+
"ActiveRecord::RecordNotFound": "Shoot, didn't find anything."
|
111
|
+
```
|
112
|
+
|
113
|
+
### Ajax flash message handling
|
95
114
|
|
96
115
|
There is also a `turboboost:success` event that is triggered and passed a hash of all current flash messages if they are present:
|
97
116
|
|
@@ -100,7 +119,7 @@ $(document).on "turboboost:success", (e, flash) ->
|
|
100
119
|
console.log(flash) # -> {'notice': 'Post was successfully created.'}
|
101
120
|
```
|
102
121
|
|
103
|
-
|
122
|
+
### Scoped response rendering
|
104
123
|
|
105
124
|
Turboboost also provides some options for rendering AJAX responses at specific locations in the DOM:
|
106
125
|
|
@@ -111,7 +130,7 @@ Turboboost also provides some options for rendering AJAX responses at specific l
|
|
111
130
|
|`:prepend` |`prepend()` |
|
112
131
|
|`:append` |`append()` |
|
113
132
|
|
114
|
-
The value can be any jQuery selector.
|
133
|
+
The value can be any jQuery selector. Example usage:
|
115
134
|
|
116
135
|
``` ruby
|
117
136
|
respond_to do |format|
|
@@ -17,6 +17,12 @@ enableForm = ($form) ->
|
|
17
17
|
disableForm = ($form) ->
|
18
18
|
$form.find("[type='submit']").attr('disabled', 'disabled')
|
19
19
|
|
20
|
+
tryJSONParse = (str) ->
|
21
|
+
try
|
22
|
+
JSON.parse str
|
23
|
+
catch e
|
24
|
+
null
|
25
|
+
|
20
26
|
turboboostFormError = (e, errors) ->
|
21
27
|
return if !Turboboost.insertErrors
|
22
28
|
errors = tryJSONParse errors
|
@@ -24,7 +30,17 @@ turboboostFormError = (e, errors) ->
|
|
24
30
|
$form = $(e.target)
|
25
31
|
$el = $form.find(errID)
|
26
32
|
if !$el.length
|
27
|
-
$
|
33
|
+
$el = $("<div id='#{errID.substr(1)}'></div>")
|
34
|
+
switch Turboboost.insertErrors
|
35
|
+
when "append" then $form.append($el)
|
36
|
+
when "beforeSubmit" then $form.find("[type='submit']").before($el)
|
37
|
+
when "afterSubmit" then $form.find("[type='submit']").after($el)
|
38
|
+
when true then $form.prepend($el)
|
39
|
+
else
|
40
|
+
if Turboboost.insertErrors.match(/^\W+/)
|
41
|
+
$form.find(Turboboost.insertErrors).html($el)
|
42
|
+
else
|
43
|
+
$form.prepend($el)
|
28
44
|
$el.html errTemplate(errors)
|
29
45
|
|
30
46
|
turboboostComplete = (e, resp) ->
|
@@ -33,6 +49,7 @@ turboboostComplete = (e, resp) ->
|
|
33
49
|
|
34
50
|
if resp.status in [200..299]
|
35
51
|
$el.trigger "turboboost:success", tryJSONParse resp.getResponseHeader('X-Flash')
|
52
|
+
$el.find(errID).remove() if Turboboost.insertErrors and isForm
|
36
53
|
if (location = resp.getResponseHeader('Location')) and !$el.attr('data-no-turboboost-redirect')
|
37
54
|
Turbolinks.visit(location)
|
38
55
|
else
|
@@ -50,16 +67,10 @@ turboboostBeforeSend = (e, xhr, settings) ->
|
|
50
67
|
isForm = @nodeName is "FORM"
|
51
68
|
return e.stopPropagation() unless isForm
|
52
69
|
disableForm $(@)
|
53
|
-
if settings.type
|
70
|
+
if settings.type is "GET"
|
54
71
|
Turbolinks.visit [@action, $(@).serialize()].join("?")
|
55
72
|
return false
|
56
73
|
|
57
|
-
tryJSONParse = (str) ->
|
58
|
-
try
|
59
|
-
JSON.parse str
|
60
|
-
catch e
|
61
|
-
null
|
62
|
-
|
63
74
|
maybeInsertSuccessResponseBody = (resp) ->
|
64
75
|
if (scope = resp.getResponseHeader('X-Within'))
|
65
76
|
$(scope).html(resp.responseText)
|
data/lib/turboboost.rb
CHANGED
@@ -28,10 +28,13 @@ module Turboboost
|
|
28
28
|
def turboboost_error_handler(error)
|
29
29
|
if request.xhr? and request.headers['HTTP_X_TURBOBOOST']
|
30
30
|
error_status = CATCHABLE_ERRORS[error.class.name]
|
31
|
+
response.headers["X-Turboboosted"] = "1"
|
31
32
|
if defined?(error.record)
|
32
33
|
render_turboboost_errors_for(error.record)
|
33
34
|
else
|
34
|
-
|
35
|
+
translation = I18n.t("turboboost.errors.#{error.class.name}")
|
36
|
+
message = translation.match("translation missing: (.+)") ? error.class.name : translation
|
37
|
+
render json: [message], status: error_status || 500, root: false
|
35
38
|
end
|
36
39
|
else
|
37
40
|
raise error
|
@@ -44,7 +47,7 @@ module Turboboost
|
|
44
47
|
|
45
48
|
def head_turboboost_success(turboboost_flash={})
|
46
49
|
turboboost_flash = _turboboost_get_flash_messages(turboboost_flash)
|
47
|
-
head :ok, "X-Flash" => turboboost_flash.to_json
|
50
|
+
head :ok, "X-Flash" => turboboost_flash.to_json, "X-Turboboosted" => "1"
|
48
51
|
end
|
49
52
|
|
50
53
|
def render(*args, &block)
|
@@ -61,6 +64,7 @@ module Turboboost
|
|
61
64
|
response.headers["X-#{h.capitalize}"] = options[h] if options[h]
|
62
65
|
end
|
63
66
|
response.headers["X-Flash"] = flash.to_hash.to_json if !flash.empty?
|
67
|
+
response.headers["X-Turboboosted"] = "1"
|
64
68
|
self.response_body = render_to_body(options)
|
65
69
|
end
|
66
70
|
|
@@ -79,7 +83,12 @@ module Turboboost
|
|
79
83
|
# set flash for turbo redirect headers
|
80
84
|
turboboost_flash = _turboboost_get_flash_messages(response_status_and_flash)
|
81
85
|
|
82
|
-
|
86
|
+
if Rails.version < "4.2"
|
87
|
+
self.location = _compute_redirect_to_location(options)
|
88
|
+
else
|
89
|
+
self.location = _compute_redirect_to_location(request, options)
|
90
|
+
end
|
91
|
+
|
83
92
|
head :ok, "X-Flash" => turboboost_flash.to_json
|
84
93
|
|
85
94
|
flash.update(turboboost_flash) # set flash for rendered view
|
@@ -152,13 +161,12 @@ module Turboboost
|
|
152
161
|
|
153
162
|
class Engine < Rails::Engine
|
154
163
|
initializer :turboboost do
|
155
|
-
|
156
|
-
|
164
|
+
ActionView::Base.send :include, Turboboost::FormHelper
|
165
|
+
end
|
157
166
|
end
|
158
167
|
|
159
168
|
end
|
160
169
|
|
161
|
-
# ActionView::Base.send :include, Turboboost::FormHelper
|
162
170
|
ActiveSupport.on_load(:action_controller) do
|
163
171
|
include Turboboost::Controller
|
164
172
|
end
|
data/lib/turboboost/version.rb
CHANGED
data/turboboost.gemspec
CHANGED
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Turboboost::VERSION
|
9
9
|
spec.authors = ["Justin Talbott"]
|
10
10
|
spec.email = ["justin@waymondo.com"]
|
11
|
-
spec.description = %q{
|
12
|
-
spec.summary = %q{Turbolinks
|
13
|
-
spec.homepage = ""
|
11
|
+
spec.description = %q{Enhanced AJAX handling for Rails apps.}
|
12
|
+
spec.summary = %q{Turboboost extends the power of Turbolinks into the forms of your Rails app and provides additional convenient AJAX handlers for forms and links.}
|
13
|
+
spec.homepage = "https://github.com/waymondo/turboboost"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency 'coffee-rails'
|
24
24
|
spec.add_dependency 'jquery-rails'
|
25
25
|
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
27
|
+
spec.add_development_dependency 'rake', '~> 0'
|
28
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turboboost
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Talbott
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -84,17 +84,17 @@ dependencies:
|
|
84
84
|
name: rake
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
-
description:
|
97
|
+
description: Enhanced AJAX handling for Rails apps.
|
98
98
|
email:
|
99
99
|
- justin@waymondo.com
|
100
100
|
executables: []
|
@@ -113,7 +113,7 @@ files:
|
|
113
113
|
- test/test_helper.rb
|
114
114
|
- test/view_test.rb
|
115
115
|
- turboboost.gemspec
|
116
|
-
homepage:
|
116
|
+
homepage: https://github.com/waymondo/turboboost
|
117
117
|
licenses:
|
118
118
|
- MIT
|
119
119
|
metadata: {}
|
@@ -133,10 +133,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
133
|
version: '0'
|
134
134
|
requirements: []
|
135
135
|
rubyforge_project:
|
136
|
-
rubygems_version: 2.2.
|
136
|
+
rubygems_version: 2.2.2
|
137
137
|
signing_key:
|
138
138
|
specification_version: 4
|
139
|
-
summary: Turbolinks
|
139
|
+
summary: Turboboost extends the power of Turbolinks into the forms of your Rails app
|
140
|
+
and provides additional convenient AJAX handlers for forms and links.
|
140
141
|
test_files:
|
141
142
|
- test/controller_test.rb
|
142
143
|
- test/test_helper.rb
|