vue_on_rails 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +66 -7
- data/lib/vue_on_rails/version.rb +1 -1
- data/vendor/assets/javascripts/vue_on_rails.js +81 -0
- metadata +17 -37
- data/vendor/assets/javascripts/vue_on_rails.js.coffee +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44cba178d9fcdee4a09bcb8e6969b510590fa589
|
4
|
+
data.tar.gz: d155a02addcf11b43bf9e540695b0d3bbdf7483d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a0099fc74fb0918e829317f94c65abc04d7c7aac797d2f7d73b70a535fed81576e2862ba01e7a4bd8d7c3ebdab287eafbeea13856d48332fe68b54294b1017e
|
7
|
+
data.tar.gz: 1df3b0d77feb32ff16cbec3b32ae920ebf35c87c425acc1160c6bf5f0bb18535a69f78407f07b7395ca1a26d86845fa2f87d3c1c60b4d7630bcdf42ff46a7874
|
data/README.md
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
# VueOnRails
|
2
2
|
|
3
|
-
|
3
|
+
Easy and simple way to use Vue.js with Ruby on Rails and Turbolinks 5.
|
4
4
|
|
5
|
-
|
5
|
+
This gem is intended to sprinkle your Rails app with Vue components.
|
6
|
+
It's compatible with Turbolinks caching system.
|
7
|
+
|
8
|
+
If you are building a pure SPA app with Vue and Rails without Turbolinks, please look into:
|
9
|
+
https://github.com/adambutler/vuejs-rails
|
10
|
+
|
11
|
+
## Requirements
|
12
|
+
|
13
|
+
- [Vue.js](https://vuejs.org/v2/guide/installation.html) >= 2.0
|
14
|
+
- [Turbolinks](https://github.com/turbolinks/turbolinks) >= 5.0
|
6
15
|
|
7
16
|
## Installation
|
8
17
|
|
@@ -20,19 +29,69 @@ Or install it yourself as:
|
|
20
29
|
|
21
30
|
$ gem install vue_on_rails
|
22
31
|
|
32
|
+
|
23
33
|
## Usage
|
24
34
|
|
25
|
-
|
35
|
+
Require vue_on_rails in application.js
|
36
|
+
```
|
37
|
+
//= require vue_on_rails
|
38
|
+
```
|
39
|
+
|
40
|
+
Init and destroy Vue components:
|
41
|
+
```
|
42
|
+
# Mount Vue components
|
43
|
+
document.addEventListener 'turbolinks:load', ->
|
44
|
+
VueOnRails.init()
|
45
|
+
|
46
|
+
# Destroy Vue components
|
47
|
+
document.addEventListener 'turbolinks:before-render', ->
|
48
|
+
VueOnRails.destroy()
|
49
|
+
```
|
50
|
+
|
51
|
+
Example Vue component in my_component.coffee
|
52
|
+
```
|
53
|
+
@MyComponent =
|
54
|
+
props: ['myProp']
|
55
|
+
template: '<div>A custom component with {{myProp}}</div>'
|
56
|
+
```
|
57
|
+
|
58
|
+
Add component in view.html.erb
|
59
|
+
```
|
60
|
+
<%= vue_component 'MyComponent', my_prop: 'awesome prop!' %>
|
61
|
+
<!-- This will output -->
|
62
|
+
<div data-vue-component="MyComponent" data-vue-props="{"my-prop":"awesome prop!"}">
|
63
|
+
<div>A custom component with awesome prop!</div>
|
64
|
+
</div>
|
65
|
+
```
|
66
|
+
|
67
|
+
## View Helper
|
68
|
+
A view helper generate a div with component and props:
|
69
|
+
```
|
70
|
+
def vue_component(component_name, props = {}, html_options = {})
|
71
|
+
```
|
72
|
+
Example with html tag:
|
73
|
+
```
|
74
|
+
<%= vue_component 'UserComponent', { user_id: 1 }, { class: 'd-inline-block align-middle' } %>
|
75
|
+
<!-- Becomes: -->
|
76
|
+
<div data-vue-component="UserComponent" data-vue-props="{'user-id': 1}" class="d-inline-block align-middle">
|
77
|
+
...
|
78
|
+
</div>
|
79
|
+
```
|
80
|
+
|
81
|
+
## Props
|
26
82
|
|
27
|
-
|
83
|
+
### Kebab-case (hyphen-delimited)
|
28
84
|
|
29
|
-
|
85
|
+
Props are automatically hyphen-delimited to follow vuejs and HTML5 standard.
|
30
86
|
|
31
|
-
|
87
|
+
### Dynamic props
|
88
|
+
```
|
89
|
+
<%= vue_component 'MessageComponent', ':my_message': 'hello world' %>
|
90
|
+
```
|
32
91
|
|
33
92
|
## Contributing
|
34
93
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
94
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/benoitontgit/vue-on-rails.
|
36
95
|
|
37
96
|
|
38
97
|
## License
|
data/lib/vue_on_rails/version.rb
CHANGED
@@ -0,0 +1,81 @@
|
|
1
|
+
this.VueOnRails = (function() {
|
2
|
+
var camelCaseToHyphen, destroyComponents, mountComponent, mountComponents, newVueInstance, setElementProps;
|
3
|
+
var vueModels = [];
|
4
|
+
var namespace = null;
|
5
|
+
|
6
|
+
mountComponents = function() {
|
7
|
+
vueModels = [];
|
8
|
+
namespace = VueOnRails.namespace;
|
9
|
+
var vueComponents = document.querySelectorAll('[data-vue-component]');
|
10
|
+
if (vueComponents.length <= 0) {
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
var results = [];
|
14
|
+
for (var i = 0; i < vueComponents.length; i++) {
|
15
|
+
results.push(mountComponent(vueComponents[i]));
|
16
|
+
}
|
17
|
+
return results;
|
18
|
+
};
|
19
|
+
|
20
|
+
mountComponent = function(component) {
|
21
|
+
var el, name, props, vm;
|
22
|
+
name = component.getAttribute('data-vue-component');
|
23
|
+
props = JSON.parse(component.getAttribute('data-vue-props'));
|
24
|
+
if ((namespace && typeof window[namespace][name] === 'object') || window[name] === 'object') {
|
25
|
+
el = document.createElement('element-to-be-mounted');
|
26
|
+
component.innerHTML = '';
|
27
|
+
component.appendChild(el);
|
28
|
+
vm = newVueInstance(name, props, el);
|
29
|
+
return vueModels.push(vm);
|
30
|
+
}
|
31
|
+
};
|
32
|
+
|
33
|
+
newVueInstance = function(name, props, el) {
|
34
|
+
var component, element, nameFormatted, obj;
|
35
|
+
nameFormatted = camelCaseToHyphen(name);
|
36
|
+
element = document.createElement(nameFormatted);
|
37
|
+
setElementProps(element, props);
|
38
|
+
component = namespace ? window[namespace][name] : window[name];
|
39
|
+
return new Vue({
|
40
|
+
el: el,
|
41
|
+
template: element.outerHTML,
|
42
|
+
components: (
|
43
|
+
obj = {},
|
44
|
+
obj["" + nameFormatted] = component,
|
45
|
+
obj
|
46
|
+
)
|
47
|
+
});
|
48
|
+
};
|
49
|
+
|
50
|
+
setElementProps = function(element, props) {
|
51
|
+
var key, results, value;
|
52
|
+
results = [];
|
53
|
+
for (key in props) {
|
54
|
+
value = props[key];
|
55
|
+
if (typeof value === 'object') {
|
56
|
+
results.push(element.setAttribute(key, JSON.stringify(value)));
|
57
|
+
} else {
|
58
|
+
results.push(element.setAttribute(key, value));
|
59
|
+
}
|
60
|
+
}
|
61
|
+
return results;
|
62
|
+
};
|
63
|
+
|
64
|
+
camelCaseToHyphen = function(string) {
|
65
|
+
return string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
66
|
+
};
|
67
|
+
|
68
|
+
destroyComponents = function() {
|
69
|
+
var j, len, vm;
|
70
|
+
for (j = 0, len = vueModels.length; j < len; j++) {
|
71
|
+
vm = vueModels[j];
|
72
|
+
vm.$destroy();
|
73
|
+
}
|
74
|
+
return vueModels = [];
|
75
|
+
};
|
76
|
+
|
77
|
+
return {
|
78
|
+
mountComponents: mountComponents,
|
79
|
+
destroyComponents: destroyComponents
|
80
|
+
};
|
81
|
+
})();
|
metadata
CHANGED
@@ -1,63 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vue_on_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benoit Zeler
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: coffee-rails
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '4.0'
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '5.0'
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '4.0'
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '5.0'
|
33
13
|
- !ruby/object:Gem::Dependency
|
34
14
|
name: bundler
|
35
15
|
requirement: !ruby/object:Gem::Requirement
|
36
16
|
requirements:
|
37
|
-
- - "
|
17
|
+
- - "<"
|
38
18
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
19
|
+
version: '2.0'
|
40
20
|
type: :development
|
41
21
|
prerelease: false
|
42
22
|
version_requirements: !ruby/object:Gem::Requirement
|
43
23
|
requirements:
|
44
|
-
- - "
|
24
|
+
- - "<"
|
45
25
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
26
|
+
version: '2.0'
|
47
27
|
- !ruby/object:Gem::Dependency
|
48
28
|
name: rake
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
50
30
|
requirements:
|
51
|
-
- - "
|
31
|
+
- - "<="
|
52
32
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
33
|
+
version: '13.0'
|
54
34
|
type: :development
|
55
35
|
prerelease: false
|
56
36
|
version_requirements: !ruby/object:Gem::Requirement
|
57
37
|
requirements:
|
58
|
-
- - "
|
38
|
+
- - "<="
|
59
39
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
40
|
+
version: '13.0'
|
61
41
|
- !ruby/object:Gem::Dependency
|
62
42
|
name: rails
|
63
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -65,9 +45,9 @@ dependencies:
|
|
65
45
|
- - ">="
|
66
46
|
- !ruby/object:Gem::Version
|
67
47
|
version: '4.0'
|
68
|
-
- - "
|
48
|
+
- - "<"
|
69
49
|
- !ruby/object:Gem::Version
|
70
|
-
version: '
|
50
|
+
version: '6'
|
71
51
|
type: :development
|
72
52
|
prerelease: false
|
73
53
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -75,9 +55,9 @@ dependencies:
|
|
75
55
|
- - ">="
|
76
56
|
- !ruby/object:Gem::Version
|
77
57
|
version: '4.0'
|
78
|
-
- - "
|
58
|
+
- - "<"
|
79
59
|
- !ruby/object:Gem::Version
|
80
|
-
version: '
|
60
|
+
version: '6'
|
81
61
|
description: Ideal to sprinkle your app with Vue components
|
82
62
|
email: benoit@kimkim.com
|
83
63
|
executables: []
|
@@ -91,8 +71,8 @@ files:
|
|
91
71
|
- lib/vue_on_rails/railtie.rb
|
92
72
|
- lib/vue_on_rails/version.rb
|
93
73
|
- lib/vue_on_rails/view_helper.rb
|
94
|
-
- vendor/assets/javascripts/vue_on_rails.js
|
95
|
-
homepage: https://github.com/benoitongit
|
74
|
+
- vendor/assets/javascripts/vue_on_rails.js
|
75
|
+
homepage: https://github.com/benoitongit/vue-on-rails
|
96
76
|
licenses:
|
97
77
|
- MIT
|
98
78
|
metadata:
|
@@ -116,5 +96,5 @@ rubyforge_project:
|
|
116
96
|
rubygems_version: 2.6.11
|
117
97
|
signing_key:
|
118
98
|
specification_version: 4
|
119
|
-
summary: Easy way to use Vue.js with Ruby on Rails and Turbolinks 5.
|
99
|
+
summary: Easy and simple way to use Vue.js with Ruby on Rails and Turbolinks 5.
|
120
100
|
test_files: []
|
@@ -1,49 +0,0 @@
|
|
1
|
-
@VueOnRails = do ->
|
2
|
-
vueModels = []
|
3
|
-
namespace = null
|
4
|
-
|
5
|
-
init = ->
|
6
|
-
vueModels = []
|
7
|
-
namespace = VueOnRails.namespace
|
8
|
-
vueComponents = document.querySelectorAll('[data-vue-component]')
|
9
|
-
return if vueComponents.length <= 0
|
10
|
-
for i in [0...vueComponents.length]
|
11
|
-
mountComponent(vueComponents[i])
|
12
|
-
|
13
|
-
mountComponent = (component) ->
|
14
|
-
name = component.getAttribute('data-vue-component')
|
15
|
-
props = JSON.parse(component.getAttribute('data-vue-props'))
|
16
|
-
if (namespace && typeof window[namespace][name] == 'object') || window[name] == 'object'
|
17
|
-
el = document.createElement('element-to-be-mounted')
|
18
|
-
component.innerHTML = ''
|
19
|
-
component.appendChild(el)
|
20
|
-
vm = newVueInstance(name, props, el)
|
21
|
-
vueModels.push(vm)
|
22
|
-
|
23
|
-
newVueInstance = (name, props, el) ->
|
24
|
-
nameFormatted = camelCaseToHyphen(name)
|
25
|
-
element = document.createElement(nameFormatted)
|
26
|
-
setElementProps(element, props)
|
27
|
-
component = if namespace then window[namespace][name] else window[name]
|
28
|
-
new Vue({
|
29
|
-
el: el
|
30
|
-
template: element.outerHTML
|
31
|
-
components: { "#{nameFormatted}": component }
|
32
|
-
})
|
33
|
-
|
34
|
-
setElementProps = (element, props) ->
|
35
|
-
for key, value of props
|
36
|
-
if typeof value == 'object'
|
37
|
-
element.setAttribute(key, JSON.stringify(value))
|
38
|
-
else
|
39
|
-
element.setAttribute(key, value)
|
40
|
-
|
41
|
-
camelCaseToHyphen = (string) ->
|
42
|
-
string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()
|
43
|
-
|
44
|
-
destroy = ->
|
45
|
-
for vm in vueModels
|
46
|
-
vm.$destroy()
|
47
|
-
vueModels = []
|
48
|
-
|
49
|
-
{ init, destroy }
|