ajaxify_rails 0.0.8 → 0.0.9
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.
- data/README.md +22 -20
- data/lib/ajaxify_rails.rb +1 -70
- data/lib/ajaxify_rails/action_controller_additions.rb +83 -0
- data/lib/ajaxify_rails/version.rb +1 -1
- data/vendor/assets/javascripts/{ajaxify_rails/ajaxify_rails.js.coffee → ajaxify_rails.js.coffee} +10 -9
- metadata +6 -7
- data/vendor/assets/javascripts/ajaxify_rails/index.js +0 -2
- data/vendor/assets/javascripts/ajaxify_rails/jquery_cookie.js +0 -61
data/README.md
CHANGED
@@ -2,22 +2,24 @@
|
|
2
2
|
|
3
3
|
No more full page reloads for your Rails app! Yay!
|
4
4
|
|
5
|
-
Automatically makes your app loading content in the background via
|
5
|
+
Automatically makes your app loading content in the background via Ajax.
|
6
6
|
|
7
|
-
Works by turning all internal links into
|
8
|
-
Also form submissions are automatically turned into
|
7
|
+
Works by turning all internal links into Ajax links that trigger an update of the page's content area.
|
8
|
+
Also form submissions are automatically turned into Ajax requests.
|
9
9
|
|
10
10
|
Features:
|
11
11
|
|
12
|
-
- Uses the html5 history interface for changing the url and making the browser's back and forward buttons work with
|
13
|
-
- Falls back to a hash based approach for browsers without the history interface (like Internet Explorer version <10)
|
12
|
+
- Uses the html5 history interface for changing the url and making the browser's back and forward buttons work with Ajax.
|
13
|
+
- Falls back to a hash based approach for browsers without the history interface (like Internet Explorer version <10).
|
14
14
|
- Hash based and non-hash URLs are interchangeable.
|
15
15
|
- Transparently handles redirects and supports page titles and flash messages.
|
16
|
-
- Tested with Chrome, Firefox, Safari and Internet Explorer 8
|
16
|
+
- Tested with Chrome, Firefox, Safari and Internet Explorer 8+.
|
17
17
|
|
18
|
-
Demo: http://ajaxify-demo.herokuapp.com/
|
18
|
+
Demo: http://ajaxify-demo.herokuapp.com/ (the first page load might take a while, as heroku needs to spin up a dyno)
|
19
19
|
|
20
|
-
|
20
|
+
Blog Post: http://rubyandrails.posterous.com/introducing-the-ajaxify-rails-gem
|
21
|
+
|
22
|
+
Inspired by the pjax_rails gem (https://github.com/rails/pjax_rails).
|
21
23
|
|
22
24
|
## Requirements
|
23
25
|
|
@@ -64,16 +66,16 @@ You can change the content wrapper in your javascript by setting
|
|
64
66
|
|
65
67
|
### Loader Animation
|
66
68
|
|
67
|
-
You probably like to have a loader image to be displayed to the user while content loads via
|
69
|
+
You probably like to have a loader image to be displayed to the user while content loads via Ajax.
|
68
70
|
This is simple. Ajaxify automatically inserts a loader div with the class `ajaxify_loader` into
|
69
|
-
the content wrapper before starting an
|
71
|
+
the content wrapper before starting an Ajax request. So just supply styles for `.ajaxify_loader` in your css, with an
|
70
72
|
animated gif as a background.
|
71
73
|
|
72
74
|
|
73
75
|
### Page Title
|
74
76
|
|
75
|
-
If you define a method called `page_title` in your application controller, Ajaxify will
|
76
|
-
update the
|
77
|
+
If you define a method called `page_title` in your application controller, returning the current page's title, Ajaxify will
|
78
|
+
use it to automatically update the title tag after the main content has changed.
|
77
79
|
|
78
80
|
### Navigation and other Layout Updates
|
79
81
|
|
@@ -87,24 +89,24 @@ updates of the page's main content. Just hook into it in your javascript and mak
|
|
87
89
|
|
88
90
|
### Flash Messages
|
89
91
|
|
90
|
-
Ajaxify
|
92
|
+
Ajaxify correctly displays your flash messages after ajaxified requests.
|
91
93
|
By default, only `flash[:notice]` is supported. If you are using for example `flash[:warning]` as well you have to set:
|
92
94
|
|
93
95
|
Ajaxify.flash_types = ['notice', 'warning']
|
94
96
|
|
95
|
-
Also make sure that you supply invisible wrapper tags in your layout
|
97
|
+
Also make sure that you supply invisible wrapper tags in your layout for each flash type you use, with the id set to the type, e.g.:
|
96
98
|
|
97
99
|
#notice{ style: "#{'display:none' unless flash[:notice]}" }
|
98
100
|
= flash[:notice]
|
99
101
|
|
100
|
-
### Links that need to trigger full Page Reloads
|
102
|
+
### Links or Forms that need to trigger full Page Reloads
|
101
103
|
|
102
|
-
|
103
|
-
|
104
|
+
Sometimes requests change the layout of the page so significantly that loading only the main content via Ajax
|
105
|
+
and doing some minor layout tweaks here and there are simply not sufficient.
|
104
106
|
|
105
|
-
There might also be links and forms which already have their own
|
107
|
+
There might also be links and forms which already have their own Ajax functionality.
|
106
108
|
|
107
|
-
|
109
|
+
For these cases you can turn off Ajaxify, by simply adding the class `no_ajaxify` directly to links or forms:
|
108
110
|
|
109
111
|
= link_to 'Change everything!', re_render_it_all_path, class: 'no_ajaxify'
|
110
112
|
|
@@ -156,7 +158,7 @@ Here is a reference of all options and callbacks you can set on the client side
|
|
156
158
|
|
157
159
|
Option/Callback Default Description
|
158
160
|
|
159
|
-
active true
|
161
|
+
active true Switches Ajaxify on or off. Needs to be set before Ajaxify.init() is called.
|
160
162
|
content_container 'main' Id of the container to insert the main content into ("yield wrapper").
|
161
163
|
base_paths null Base path segments for applications with root url redirects.
|
162
164
|
|
data/lib/ajaxify_rails.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "ajaxify_rails/version"
|
2
|
+
require "ajaxify_rails/action_controller_additions"
|
2
3
|
|
3
4
|
module AjaxifyRails
|
4
5
|
|
@@ -11,74 +12,4 @@ module AjaxifyRails
|
|
11
12
|
include ActionControllerAdditions
|
12
13
|
end
|
13
14
|
|
14
|
-
module ActionControllerAdditions
|
15
|
-
|
16
|
-
def self.included(controller)
|
17
|
-
controller.class_eval do
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def ajaxified?
|
22
|
-
request.xhr? and params[:ajaxified]
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
|
-
def render *args, &block
|
27
|
-
if ajaxified?
|
28
|
-
args = _normalize_args(*args, &block)
|
29
|
-
layout = args[:layout] || current_layout
|
30
|
-
layout = (layout == 'application' or layout == true) ? false : layout
|
31
|
-
args[:layout] = layout
|
32
|
-
|
33
|
-
flash.keys.each do |key|
|
34
|
-
cookies["flash_#{key}"] = flash[key]
|
35
|
-
flash[key] = nil
|
36
|
-
end
|
37
|
-
|
38
|
-
extra_content = (respond_to?(:ajaxify_extra_content) ? ajaxify_extra_content : '')
|
39
|
-
|
40
|
-
super args
|
41
|
-
|
42
|
-
# Store current path for redirect url changes. Also used to remove the ajaxify parameter that gets added to some auto generated urls
|
43
|
-
# like e.g. pagination links see (ajaxify.js -> on_ajaxify_success())
|
44
|
-
#
|
45
|
-
current_url_tag = view_context.content_tag(:span, request.fullpath.sub(/\?ajaxified=true&(.*)/, '?\1').sub(/(&|\?)ajaxified=true/, ''),
|
46
|
-
id: 'ajaxify_location')
|
47
|
-
|
48
|
-
response_body[0] += view_context.content_tag(:div, current_url_tag + extra_content,
|
49
|
-
id: 'ajaxify_content', style: 'display:none',
|
50
|
-
data: { page_title: respond_to?(:page_title) ? page_title : nil })
|
51
|
-
response.body = self.response_body[0]
|
52
|
-
return
|
53
|
-
end
|
54
|
-
super
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
def current_layout
|
59
|
-
return @current_layout if @current_layout
|
60
|
-
@current_layout = _layout
|
61
|
-
@current_layout = File.basename(@current_layout.identifier).split('.').first unless @current_layout.instance_of? String
|
62
|
-
@current_layout
|
63
|
-
end
|
64
|
-
|
65
|
-
|
66
|
-
def redirect_to(options = {}, response_status = {})
|
67
|
-
request.referer.sub!('#/', '') if request.referer # make redirect to back work for browsers without history api
|
68
|
-
|
69
|
-
super
|
70
|
-
|
71
|
-
ajaxify_params = "ajaxified=true&ajaxify_redirect=true"
|
72
|
-
self.location += "#{self.location =~ /\?/ ? '&' : '?'}#{ajaxify_params}" if request.xhr? # to avoid the full layout from being rendered
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
def ajaxify_redirect_to url
|
77
|
-
render inline: "<%= javascript_tag(\"Ajaxify.load({url: '#{url}'});\") %>", layout: true
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
15
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module ActionControllerAdditions
|
2
|
+
|
3
|
+
def self.included(controller)
|
4
|
+
controller.class_eval do
|
5
|
+
|
6
|
+
# override in your controller
|
7
|
+
def page_title
|
8
|
+
nil
|
9
|
+
end
|
10
|
+
|
11
|
+
# override in your controller
|
12
|
+
def ajaxify_extra_content
|
13
|
+
''
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def ajaxified?
|
20
|
+
request.xhr? and params[:ajaxified]
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def render *args, &block
|
25
|
+
if ajaxified?
|
26
|
+
args = _normalize_args(*args, &block)
|
27
|
+
layout = args[:layout] || current_layout
|
28
|
+
layout = (layout == 'application' or layout == true) ? false : layout
|
29
|
+
args[:layout] = layout
|
30
|
+
|
31
|
+
flashes = {}
|
32
|
+
flash.keys.each do |key|
|
33
|
+
flashes[key] = flash[key]
|
34
|
+
flash[key] = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
extra_content = ajaxify_extra_content
|
39
|
+
|
40
|
+
super args
|
41
|
+
|
42
|
+
# Store current path for redirect url changes. Also used to remove the ajaxify parameter that gets added to some auto generated urls
|
43
|
+
# like e.g. pagination links see (ajaxify.js -> on_ajaxify_success())
|
44
|
+
#
|
45
|
+
current_url_tag = view_context.content_tag(:span, request.fullpath.sub(/\?ajaxified=true&(.*)/, '?\1').sub(/(&|\?)ajaxified=true/, ''),
|
46
|
+
id: 'ajaxify_location')
|
47
|
+
|
48
|
+
response_body[0] += view_context.content_tag(:div, current_url_tag + extra_content,
|
49
|
+
id: 'ajaxify_content', style: 'display:none',
|
50
|
+
data: { page_title: page_title,
|
51
|
+
flashes: flashes.to_json } )
|
52
|
+
response.body = self.response_body[0]
|
53
|
+
return
|
54
|
+
end
|
55
|
+
super
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def current_layout
|
60
|
+
return @current_layout if @current_layout
|
61
|
+
@current_layout = _layout
|
62
|
+
@current_layout = File.basename(@current_layout.identifier).split('.').first unless @current_layout.instance_of? String
|
63
|
+
@current_layout
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def redirect_to(options = {}, response_status = {})
|
68
|
+
request.referer.sub!('#/', '') if request.referer # make redirect to back work for browsers without history api
|
69
|
+
|
70
|
+
super
|
71
|
+
|
72
|
+
ajaxify_params = "ajaxified=true&ajaxify_redirect=true"
|
73
|
+
self.location += "#{self.location =~ /\?/ ? '&' : '?'}#{ajaxify_params}" if request.xhr? # to avoid the full layout from being rendered
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def ajaxify_redirect_to url
|
78
|
+
render inline: "<%= javascript_tag(\"Ajaxify.load({url: '#{url}'});\") %>", layout: true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
data/vendor/assets/javascripts/{ajaxify_rails/ajaxify_rails.js.coffee → ajaxify_rails.js.coffee}
RENAMED
@@ -12,7 +12,6 @@
|
|
12
12
|
on_before_load: null
|
13
13
|
on_success: null
|
14
14
|
on_success_once: null
|
15
|
-
on_before_correct_url: null
|
16
15
|
|
17
16
|
# flash
|
18
17
|
#
|
@@ -141,13 +140,11 @@
|
|
141
140
|
self.on_ajaxify_success data, status, jqXHR, pop_state, options
|
142
141
|
|
143
142
|
|
144
|
-
|
143
|
+
show_flashes: (flashes) ->
|
145
144
|
self = this
|
146
145
|
$.each this.flash_types, ->
|
147
|
-
|
148
|
-
|
149
|
-
$("##{this}").html $.cookie(cookie_name)
|
150
|
-
$.cookie cookie_name, null
|
146
|
+
if flashes and flashes[this]
|
147
|
+
$("##{this}").html flashes[this]
|
151
148
|
$("##{this}").show()
|
152
149
|
if self.flash_effect
|
153
150
|
if self.clear_flash_effect
|
@@ -162,12 +159,13 @@
|
|
162
159
|
$("##{this.content_container}").html data
|
163
160
|
|
164
161
|
title = $('#ajaxify_content').data('page-title')
|
162
|
+
flashes = $('#ajaxify_content').data('flashes')
|
165
163
|
|
166
164
|
# Correct the url after a redirect and when it has the ajaxify param in it.
|
167
165
|
# The latter can happen e.g. for pagination links that are auto generated.
|
168
|
-
current_url = $('#ajaxify_content #ajaxify_location').
|
166
|
+
current_url = $('#ajaxify_content #ajaxify_location').html()
|
169
167
|
if options.url != current_url
|
170
|
-
options.url = current_url.replace(/(
|
168
|
+
options.url = current_url.replace(/(&|&|\?)ajaxify_redirect=true/,'')
|
171
169
|
options.type = 'GET'
|
172
170
|
|
173
171
|
this.update_url options, pop_state
|
@@ -180,7 +178,7 @@
|
|
180
178
|
if title
|
181
179
|
document.title = title.replace /&/, '&' # Todo: need to figure out what else needs to be unescaped
|
182
180
|
|
183
|
-
this.
|
181
|
+
this.show_flashes(flashes)
|
184
182
|
|
185
183
|
if this.on_success
|
186
184
|
this.on_success( data, status, jqXHR, options.url )
|
@@ -237,6 +235,9 @@
|
|
237
235
|
if this.active
|
238
236
|
|
239
237
|
if window.location.hash.indexOf('#') == 0 # if url has a '#' in it treat it as a non history interface hash based scheme url
|
238
|
+
|
239
|
+
return unless window.location.hash.match(/^#(\/|\?)/) # check hash format
|
240
|
+
|
240
241
|
if !window.history.pushState
|
241
242
|
Ajaxify.load_page_from_hash = true # notify Ajaxify that a hash will be loaded and ignore all other calls to load until hash url is loaded
|
242
243
|
else
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ajaxify_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -49,10 +49,9 @@ files:
|
|
49
49
|
- Rakefile
|
50
50
|
- ajaxify_rails.gemspec
|
51
51
|
- lib/ajaxify_rails.rb
|
52
|
+
- lib/ajaxify_rails/action_controller_additions.rb
|
52
53
|
- lib/ajaxify_rails/version.rb
|
53
|
-
- vendor/assets/javascripts/ajaxify_rails
|
54
|
-
- vendor/assets/javascripts/ajaxify_rails/index.js
|
55
|
-
- vendor/assets/javascripts/ajaxify_rails/jquery_cookie.js
|
54
|
+
- vendor/assets/javascripts/ajaxify_rails.js.coffee
|
56
55
|
homepage: https://github.com/ncri/ajaxify_rails
|
57
56
|
licenses: []
|
58
57
|
post_install_message:
|
@@ -67,7 +66,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
67
66
|
version: '0'
|
68
67
|
segments:
|
69
68
|
- 0
|
70
|
-
hash:
|
69
|
+
hash: -4098210962024842492
|
71
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
71
|
none: false
|
73
72
|
requirements:
|
@@ -76,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
75
|
version: '0'
|
77
76
|
segments:
|
78
77
|
- 0
|
79
|
-
hash:
|
78
|
+
hash: -4098210962024842492
|
80
79
|
requirements: []
|
81
80
|
rubyforge_project:
|
82
81
|
rubygems_version: 1.8.24
|
@@ -1,61 +0,0 @@
|
|
1
|
-
/*jshint eqnull:true */
|
2
|
-
/*!
|
3
|
-
* jQuery Cookie Plugin v1.1
|
4
|
-
* https://github.com/carhartl/jquery-cookie
|
5
|
-
*
|
6
|
-
* Copyright 2011, Klaus Hartl
|
7
|
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
8
|
-
* http://www.opensource.org/licenses/mit-license.php
|
9
|
-
* http://www.opensource.org/licenses/GPL-2.0
|
10
|
-
*/
|
11
|
-
(function($, document) {
|
12
|
-
|
13
|
-
var pluses = /\+/g;
|
14
|
-
function raw(s) {
|
15
|
-
return s;
|
16
|
-
}
|
17
|
-
function decoded(s) {
|
18
|
-
return decodeURIComponent(s.replace(pluses, ' '));
|
19
|
-
}
|
20
|
-
|
21
|
-
$.cookie = function(key, value, options) {
|
22
|
-
|
23
|
-
// key and at least value given, set cookie...
|
24
|
-
if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value == null)) {
|
25
|
-
options = $.extend({}, $.cookie.defaults, options);
|
26
|
-
|
27
|
-
if (value == null) {
|
28
|
-
options.expires = -1;
|
29
|
-
}
|
30
|
-
|
31
|
-
if (typeof options.expires === 'number') {
|
32
|
-
var days = options.expires, t = options.expires = new Date();
|
33
|
-
t.setDate(t.getDate() + days);
|
34
|
-
}
|
35
|
-
|
36
|
-
value = String(value);
|
37
|
-
|
38
|
-
return (document.cookie = [
|
39
|
-
encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
|
40
|
-
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
|
41
|
-
options.path ? '; path=' + options.path : '',
|
42
|
-
options.domain ? '; domain=' + options.domain : '',
|
43
|
-
options.secure ? '; secure' : ''
|
44
|
-
].join(''));
|
45
|
-
}
|
46
|
-
|
47
|
-
// key and possibly options given, get cookie...
|
48
|
-
options = value || $.cookie.defaults || {};
|
49
|
-
var decode = options.raw ? raw : decoded;
|
50
|
-
var cookies = document.cookie.split('; ');
|
51
|
-
for (var i = 0, parts; (parts = cookies[i] && cookies[i].split('=')); i++) {
|
52
|
-
if (decode(parts.shift()) === key) {
|
53
|
-
return decode(parts.join('='));
|
54
|
-
}
|
55
|
-
}
|
56
|
-
return null;
|
57
|
-
};
|
58
|
-
|
59
|
-
$.cookie.defaults = {};
|
60
|
-
|
61
|
-
})(jQuery, document);
|