mvcoffee-rails 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/app/assets/javascripts/mvcoffee.js +1556 -0
- data/app/assets/javascripts/mvcoffee.min.js +2 -0
- data/app/helpers/mvcoffee_helper.rb +12 -0
- data/lib/mvcoffee/mvcoffee.rb +446 -0
- data/lib/mvcoffee/rails/active_record.rb +80 -0
- data/lib/mvcoffee/rails/engine.rb +6 -0
- data/lib/mvcoffee/rails/version.rb +5 -0
- data/lib/mvcoffee-rails.rb +146 -0
- metadata +98 -0
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'mvcoffee/rails/engine'
|
2
|
+
require "mvcoffee/rails/version"
|
3
|
+
require "mvcoffee/rails/active_record"
|
4
|
+
|
5
|
+
require 'mvcoffee/mvcoffee'
|
6
|
+
|
7
|
+
|
8
|
+
# This probably doesn't belong in this file, but if I try to do it in a file called
|
9
|
+
# anything having to do with "action_controller", it confuses the whole Rails system
|
10
|
+
# and nothing works. It works the way I want it to in this file, so I'm not messin'
|
11
|
+
# with it! Not elegant, but if it ain't broke....
|
12
|
+
module ActionController
|
13
|
+
class Base
|
14
|
+
# Set up "around aliases". Rename the render and redirect methods to something
|
15
|
+
# that is guaranteed not to clash with anything. I use these aliases below in the
|
16
|
+
# render_mvcoffee method.
|
17
|
+
alias :_mvcoffee_alias_render :render
|
18
|
+
alias :_mvcoffee_alias_redirect_to :redirect_to
|
19
|
+
|
20
|
+
# Call this class macro in your application_controller.rb file if you want to
|
21
|
+
# do the monkeypatch for the whole application.
|
22
|
+
#
|
23
|
+
# I could make it so this happens by default, but I think it should require an
|
24
|
+
# explicit action on the programmer's part to make a monkeypatch with
|
25
|
+
# potentially unintended consequences happen. This is in keeping with the
|
26
|
+
# principle of Least Surprise. If something goes wonky after you called this
|
27
|
+
# method, well, you know you called it, so you can comment it out (and probably
|
28
|
+
# curse me online) Let's hope it never comes to that....
|
29
|
+
def self.monkeypatch_mvcoffee
|
30
|
+
|
31
|
+
# The really cool thing about monkeypatching this method is that it gets called
|
32
|
+
# automagically in your controllers at the end of each action if the action falls
|
33
|
+
# through. So, with this in place, with no extra action required by the
|
34
|
+
# programmer, the MVCoffee thing will just happen. This means you can do a
|
35
|
+
# redirect even on a json request without even thinking about it!
|
36
|
+
define_method :render do |action = nil, opts = {}|
|
37
|
+
# Uncomment this is you want to prove it to yourself that it really is doing
|
38
|
+
# the around alias.
|
39
|
+
# puts "!!!! Doing monkeypatched render !!!!!"
|
40
|
+
render_mvcoffee action, opts
|
41
|
+
end
|
42
|
+
|
43
|
+
# And the cool thing about monkeypatching this method is that you can call it
|
44
|
+
# indiscriminately without doing that format...do business checking for json
|
45
|
+
# and avoiding redirecting if it is json. Just go ahead and call redirect_to,
|
46
|
+
# and the client framework will do the right thing, handling the redirect AFTER
|
47
|
+
# processing the json fetched over ajax.
|
48
|
+
define_method :redirect_to do |action, opts = {}|
|
49
|
+
# Uncomment this is you want to prove it to yourself that it really is doing
|
50
|
+
# the around alias.
|
51
|
+
# puts "!!!! Doing monkeypatched redirect_to !!!!!"
|
52
|
+
@mvcoffee.set_redirect action, opts
|
53
|
+
render_mvcoffee
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
# MVCoffee is a module that should be included at the top of your ApplicationController
|
63
|
+
# just below this line:
|
64
|
+
# class ApplicationController < ActionController::Base
|
65
|
+
#
|
66
|
+
# It will add two methods to all controllers:
|
67
|
+
#
|
68
|
+
# * is_full_page_load? which will return true if it detects a full page load has occurred,
|
69
|
+
# meaning the client-side MVCoffee data store has been wiped out. Otherwise you can
|
70
|
+
# assume the client-side cache is still intact.
|
71
|
+
#
|
72
|
+
# * render_mvcoffee which should be called instead of `render` or `redirect_to` in any
|
73
|
+
# action that relies on MVCoffee to handle things on the client side (refresh the cache,
|
74
|
+
# handle a redirect on the client, or simply update via ajax). It will handle doing the
|
75
|
+
# right thing whether the request is html or json (saving you that format verbosity).
|
76
|
+
#
|
77
|
+
# It will also declare an instance variable available to all controllers, `@mvcoffee`,
|
78
|
+
# an instance of an MVCoffee::MVCoffee object. All controller actions that use
|
79
|
+
# MVCoffee should make modifications to this object (using methods such as
|
80
|
+
# `set_model_data` and `set_session`, etc.) before calling `render_mvcoffee`, then it
|
81
|
+
# will automatically be sent to the client as json.
|
82
|
+
#
|
83
|
+
# Author:: Kirk Bowers (mailto:kirkbowers@yahoo.com)
|
84
|
+
# Copyright:: Copyright (c) 2014 Kirk Bowers
|
85
|
+
# License:: MIT License
|
86
|
+
module MVCoffee
|
87
|
+
|
88
|
+
# Does it's best attempt at determining whether the incoming request happened over
|
89
|
+
# explicit ajax, implicit ajax (via turbolinks), or if it is a full page load.
|
90
|
+
# Returns true if it looks like the request is a full page load, meaning the client
|
91
|
+
# side javascript session is going to be started over fresh and all cached data will
|
92
|
+
# be wiped out.
|
93
|
+
def is_full_page_load?
|
94
|
+
!request.xhr? and !request.headers["HTTP_X_XHR_REFERER"]
|
95
|
+
end
|
96
|
+
|
97
|
+
# Handles rendering for actions that rely on MVCoffee on the client. It will send
|
98
|
+
# the `@mvcoffee` object to the client serialized as json, and do the right thing
|
99
|
+
# based on whether the request is html or json.
|
100
|
+
#
|
101
|
+
# If it is an html request, and there is a redirect issued in the `@mvcoffee` object,
|
102
|
+
# this method will issue a hard redirect from the server (which will
|
103
|
+
# wipe out the cache on the client). This is desirable for actions that only want
|
104
|
+
# to maintain the session when the request is over json.
|
105
|
+
def render_mvcoffee(action = nil, opts = {})
|
106
|
+
respond_to do |format|
|
107
|
+
format.html {
|
108
|
+
if @mvcoffee.redirect
|
109
|
+
if opts == {} and action.respond_to? :to_hash
|
110
|
+
opts = action
|
111
|
+
end
|
112
|
+
|
113
|
+
_mvcoffee_alias_redirect_to @mvcoffee.redirect, @mvcoffee.flash.merge(opts)
|
114
|
+
else
|
115
|
+
_mvcoffee_alias_render action, opts
|
116
|
+
end
|
117
|
+
}
|
118
|
+
format.json { _mvcoffee_alias_render json: @mvcoffee.to_json }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
# If this module is included into the application controller, this will fire for
|
124
|
+
# all controllers and instantiate the `@mvcoffee` object.
|
125
|
+
::ActionController::Base::before_action do
|
126
|
+
# Glean the client session from the cookie.
|
127
|
+
session = cookies['mvcoffee_session']
|
128
|
+
client_session = {}
|
129
|
+
|
130
|
+
Rails.logger.info "-- MVCoffee -- Received Client Session #{session}"
|
131
|
+
|
132
|
+
if session
|
133
|
+
client_session = CGI.parse(session)
|
134
|
+
end
|
135
|
+
|
136
|
+
# reset the cookie
|
137
|
+
cookies['mvcoffee_session'] = { value: "", path: "/" }
|
138
|
+
|
139
|
+
# We have to go back to the root with the leading :: since this module most likely
|
140
|
+
# has been include'd into the controllers performing this before_action
|
141
|
+
@mvcoffee = ::MVCoffee::MVCoffee.new client_session
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mvcoffee-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kirk Bowers
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: railties
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.2.16
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.2.16
|
55
|
+
description: "<p><code>mvcoffee-rails</code> is a Rails gem that makes it easy to
|
56
|
+
use the \n<a href=\"https://github.com/kirkbowers/mvcoffee\">MVCoffee</a> client-side
|
57
|
+
MVC framework in your\nRails project.</p>\n\n<p>The full documentation for this
|
58
|
+
gem is at <a href=\"http://mvcoffee.org/mvcoffee-rails\">mvcoffee.org</a>.</p>\n"
|
59
|
+
email:
|
60
|
+
- kirkbowers@yahoo.com
|
61
|
+
executables: []
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- app/assets/javascripts/mvcoffee.js
|
66
|
+
- app/assets/javascripts/mvcoffee.min.js
|
67
|
+
- app/helpers/mvcoffee_helper.rb
|
68
|
+
- lib/mvcoffee-rails.rb
|
69
|
+
- lib/mvcoffee/mvcoffee.rb
|
70
|
+
- lib/mvcoffee/rails/active_record.rb
|
71
|
+
- lib/mvcoffee/rails/engine.rb
|
72
|
+
- lib/mvcoffee/rails/version.rb
|
73
|
+
homepage: https://github.com/kirkbowers/mvcoffee-rails
|
74
|
+
licenses:
|
75
|
+
- MIT
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.3.6
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.2.3
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: The server-side Rails gem that makes it easy to use the MVCoffee client-side
|
97
|
+
MVC framework in your Rails project. Full documentation is at mvcoffee.org.
|
98
|
+
test_files: []
|