hyper-resource 1.0.0.lap88 → 1.0.0.lap89

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/docs/HyperRecord.html +1 -1
  3. data/docs/HyperRecord/ClassMethods.html +596 -399
  4. data/docs/HyperRecord/ClientInstanceMethods.html +91 -65
  5. data/docs/HyperRecord/Collection.html +1 -1
  6. data/docs/HyperRecord/DummyValue.html +1 -1
  7. data/docs/HyperRecord/PubSub.html +61 -61
  8. data/docs/HyperRecord/PubSub/ClassMethods.html +175 -133
  9. data/docs/HyperRecord/ServerClassMethods.html +174 -43
  10. data/docs/Hyperloop.html +1 -1
  11. data/docs/Hyperloop/Resource.html +2 -2
  12. data/docs/Hyperloop/Resource/ClientDrivers.html +15 -3
  13. data/docs/Hyperloop/Resource/HTTP.html +1 -1
  14. data/docs/Hyperloop/Resource/MethodsController.html +1 -1
  15. data/docs/Hyperloop/Resource/PropertiesController.html +1 -1
  16. data/docs/Hyperloop/Resource/PubSub.html +175 -133
  17. data/docs/Hyperloop/Resource/PubSub/ClassMethods.html +1 -1
  18. data/docs/Hyperloop/Resource/RelationsController.html +1 -1
  19. data/docs/Hyperloop/Resource/ScopesController.html +1 -1
  20. data/docs/Hyperloop/Resource/SecurityError.html +1 -1
  21. data/docs/Hyperloop/Resource/SecurityGuards.html +1 -1
  22. data/docs/Hyperloop/Resource/SecurityGuards/ClassMethods.html +1 -1
  23. data/docs/_index.html +1 -1
  24. data/docs/file.API.html +1 -1
  25. data/docs/file.JSON_format.html +1 -1
  26. data/docs/file.PubSub.html +1 -1
  27. data/docs/file.README.html +216 -2
  28. data/docs/index.html +216 -2
  29. data/docs/method_list.html +110 -94
  30. data/docs/top-level-namespace.html +1 -1
  31. data/lib/hyper_record/server_class_methods.rb +1 -11
  32. data/lib/hyperloop/resource/version.rb +1 -1
  33. metadata +2 -2
@@ -95,7 +95,7 @@
95
95
  </div>
96
96
 
97
97
  <div id="footer">
98
- Generated on Sun Jun 10 23:20:59 2018 by
98
+ Generated on Tue Aug 14 17:40:32 2018 by
99
99
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
100
100
  0.9.13 (ruby-2.5.1).
101
101
  </div>
@@ -519,7 +519,7 @@
519
519
  </div>
520
520
 
521
521
  <div id="footer">
522
- Generated on Sun Jun 10 23:21:00 2018 by
522
+ Generated on Tue Aug 14 17:40:33 2018 by
523
523
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
524
524
  0.9.13 (ruby-2.5.1).
525
525
  </div>
@@ -370,7 +370,7 @@
370
370
  </div>
371
371
 
372
372
  <div id="footer">
373
- Generated on Sun Jun 10 23:21:00 2018 by
373
+ Generated on Tue Aug 14 17:40:33 2018 by
374
374
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
375
375
  0.9.13 (ruby-2.5.1).
376
376
  </div>
@@ -114,7 +114,7 @@
114
114
  </div>
115
115
 
116
116
  <div id="footer">
117
- Generated on Sun Jun 10 23:21:00 2018 by
117
+ Generated on Tue Aug 14 17:40:33 2018 by
118
118
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
119
119
  0.9.13 (ruby-2.5.1).
120
120
  </div>
@@ -289,7 +289,7 @@
289
289
  </div>
290
290
 
291
291
  <div id="footer">
292
- Generated on Sun Jun 10 23:21:00 2018 by
292
+ Generated on Tue Aug 14 17:40:32 2018 by
293
293
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
294
294
  0.9.13 (ruby-2.5.1).
295
295
  </div>
@@ -216,7 +216,7 @@
216
216
  </div>
217
217
 
218
218
  <div id="footer">
219
- Generated on Sun Jun 10 23:21:00 2018 by
219
+ Generated on Tue Aug 14 17:40:32 2018 by
220
220
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
221
221
  0.9.13 (ruby-2.5.1).
222
222
  </div>
data/docs/_index.html CHANGED
@@ -292,7 +292,7 @@
292
292
  </div>
293
293
 
294
294
  <div id="footer">
295
- Generated on Sun Jun 10 23:20:59 2018 by
295
+ Generated on Tue Aug 14 17:40:30 2018 by
296
296
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
297
297
  0.9.13 (ruby-2.5.1).
298
298
  </div>
data/docs/file.API.html CHANGED
@@ -128,7 +128,7 @@ end
128
128
  </div></div>
129
129
 
130
130
  <div id="footer">
131
- Generated on Sun Jun 10 23:20:59 2018 by
131
+ Generated on Tue Aug 14 17:40:31 2018 by
132
132
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
133
133
  0.9.13 (ruby-2.5.1).
134
134
  </div>
@@ -124,7 +124,7 @@
124
124
  </div></div>
125
125
 
126
126
  <div id="footer">
127
- Generated on Sun Jun 10 23:20:59 2018 by
127
+ Generated on Tue Aug 14 17:40:31 2018 by
128
128
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
129
129
  0.9.13 (ruby-2.5.1).
130
130
  </div>
@@ -76,7 +76,7 @@ updated.</p>
76
76
  </div></div>
77
77
 
78
78
  <div id="footer">
79
- Generated on Sun Jun 10 23:20:59 2018 by
79
+ Generated on Tue Aug 14 17:40:31 2018 by
80
80
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
81
81
  0.9.13 (ruby-2.5.1).
82
82
  </div>
@@ -68,6 +68,10 @@ clients when using Hyperloop and Rails.</p>
68
68
  <p><a href="http://www.youtube.com/watch?v=fPSpESBbeMQ"><img
69
69
  src="http://img.youtube.com/vi/fPSpESBbeMQ/0.jpg"></a></p>
70
70
 
71
+ <p><a href="https://janbiedermann.github.io/hyper-resource">Documentation</a></p>
72
+
73
+ <p>Supports Pusher and ActionCable (thanks @gabrielrios)</p>
74
+
71
75
  <h2 id="label-Motivation">Motivation</h2>
72
76
  <ul><li>
73
77
  <p>To co-exist with a resource based REST API</p>
@@ -178,11 +182,221 @@ up your code and the client an server can share the same Models.</p>
178
182
 
179
183
  <h2 id="label-Implementation">Implementation</h2>
180
184
 
181
- <p>How to install.…</p>
185
+ <h2 id="label-Implementation">Implementation</h2>
186
+
187
+ <p>Hyperloop needs to be installed and working before you install
188
+ HyperResource. These instructions are likely to change/be simplified as
189
+ this Gem matures.</p>
190
+ <ul><li>
191
+ <p>Add the gems (make sure its the latest version)</p>
192
+ </li></ul>
193
+
194
+ <p><code>gem &#39;hyper-resource&#39;, &#39;1.0.0.lap86&#39;</code> <code>gem
195
+ &#39;opal-jquery&#39;, github: &#39;janbiedermann/opal-jquery&#39;, branch:
196
+ &#39;why_to_n&#39;</code> <code>gem &#39;opal-activesupport&#39;, github:
197
+ &#39;opal/opal-activesupport&#39;, branch: &#39;master&#39;</code></p>
198
+ <ul><li>
199
+ <p>Require HyperResource in your <code>hyperloop_webpack_loader.rb</code> file</p>
200
+ </li></ul>
201
+
202
+ <p><code>require &#39;hyper-resource&#39;</code> <code>require
203
+ &#39;opal-jquery&#39;</code></p>
204
+ <ul><li>
205
+ <p>Update your <code>application_record.rb</code> file and move it to the
206
+ <code>hyperloop/models</code> folder</p>
207
+ </li></ul>
208
+
209
+ <p><code> # application_record.rb if RUBY_ENGINE == &#39;opal&#39; class
210
+ ApplicationRecord def self.inherited(base)
211
+ base.include(HyperRecord) end end else class ApplicationRecord &lt;
212
+ ActiveRecord::Base # when updating this part, also update the
213
+ ApplicationRecord in app/models/application_record.rb # for rails eager
214
+ loading in production, so production doesn&#39;t fail
215
+ self.abstract_class = true extend HyperRecord::ServerClassMethods
216
+ include HyperRecord::PubSub end end </code></p>
217
+ <ul><li>
218
+ <p>Move the models you want on the client to the <code>hyperloop/models</code>
219
+ folder</p>
220
+ </li><li>
221
+ <p>Make sure you guard anything in your model which you do not want on the
222
+ client:</p>
223
+ </li></ul>
224
+
225
+ <pre class="code ruby"><code class="ruby"><span class='kw'>unless</span> <span class='const'>RUBY_ENGINE</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>opal</span><span class='tstring_end'>&#39;</span></span>
226
+ <span class='comment'># herein stuff that you do not want on the client (Devise, etc)
227
+ </span><span class='kw'>end</span>
228
+ </code></pre>
229
+ <ul><li>
230
+ <p>Add Pusher to your gemfile</p>
231
+ </li></ul>
232
+
233
+ <p><code>gem pusher</code></p>
234
+ <ul><li>
235
+ <p>Add it with Yarn</p>
236
+ </li></ul>
237
+
238
+ <p><code>yarn add pusher-js</code></p>
239
+ <ul><li>
240
+ <p>Then import in your <code>app.js</code></p>
241
+ </li></ul>
242
+
243
+ <p><code>import Pusher from &#39;pusher-js&#39;;</code> <code>global.Pusher =
244
+ Pusher;</code></p>
245
+ <ul><li>
246
+ <p>Add your api endpoint to <code>hyperloop.rb</code></p>
247
+ </li></ul>
248
+
249
+ <p><code>config.resource_api_base_path = &#39;/api&#39;</code></p>
250
+ <ul><li>
251
+ <p>Create you API controllers as normal - ensure they return JSON in this
252
+ format</p>
253
+ </li></ul>
254
+
255
+ <pre class="code ruby"><code class="ruby"><span class='lbrace'>{</span>
256
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>members</span><span class='label_end'>&quot;:</span><span class='lbracket'>[</span>
257
+ <span class='lbrace'>{</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>member</span><span class='label_end'>&quot;:</span><span class='lbrace'>{</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>id</span><span class='label_end'>&quot;:</span><span class='int'>1</span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>email</span><span class='label_end'>&quot;:</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>a@b.com</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>first_name</span><span class='label_end'>&quot;:</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>John</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>last_name</span><span class='label_end'>&quot;:</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Smith</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='rbrace'>}</span><span class='comma'>,</span>
258
+ <span class='lbrace'>{</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>member</span><span class='label_end'>&quot;:</span><span class='lbrace'>{</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>id</span><span class='label_end'>&quot;:</span><span class='int'>2</span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>email</span><span class='label_end'>&quot;:</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>b@c.com</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>first_name</span><span class='label_end'>&quot;:</span><span class='id identifier rubyid_null'>null</span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>last_name</span><span class='label_end'>&quot;:</span><span class='id identifier rubyid_null'>null</span><span class='rbrace'>}</span><span class='rbrace'>}</span>
259
+ <span class='rbracket'>]</span>
260
+ <span class='rbrace'>}</span>
261
+ </code></pre>
262
+
263
+ <p>Rabl gem example view:</p>
264
+
265
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_collection'>collection</span> <span class='ivar'>@members</span><span class='comma'>,</span> <span class='label'>root:</span> <span class='symbol'>:members</span>
266
+ <span class='id identifier rubyid_attributes'>attributes</span> <span class='symbol'>:id</span><span class='comma'>,</span>
267
+ <span class='symbol'>:email</span><span class='comma'>,</span>
268
+ <span class='symbol'>:first_name</span><span class='comma'>,</span>
269
+ <span class='symbol'>:last_name</span>
270
+ </code></pre>
271
+ <ul><li>
272
+ <p>Create your API controller and make sure to implement <code>show</code> as
273
+ this is called by HyperResource. Please see the example controller below
274
+ for details on pub_sub</p>
275
+ </li></ul>
276
+
277
+ <pre class="code ruby"><code class="ruby"><span class='kw'>module</span> <span class='const'>Api</span>
278
+ <span class='kw'>class</span> <span class='const'>PersonasController</span> <span class='op'>&lt;</span> <span class='const'>ApplicationController</span>
279
+ <span class='comment'># GET /api/personas.json
280
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_index'>index</span>
281
+ <span class='id identifier rubyid_authorize'>authorize</span><span class='lparen'>(</span><span class='const'>Persona</span><span class='rparen'>)</span>
282
+
283
+ <span class='ivar'>@personas</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_all'>all</span>
284
+ <span class='id identifier rubyid_subscribe_scope'>subscribe_scope</span><span class='lparen'>(</span><span class='ivar'>@personas</span><span class='comma'>,</span> <span class='const'>Persona</span><span class='comma'>,</span> <span class='symbol'>:all</span><span class='rparen'>)</span>
285
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
286
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
287
+ <span class='kw'>end</span>
288
+ <span class='kw'>end</span>
289
+
290
+ <span class='comment'># GET /api/personas/123.json
291
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_show'>show</span>
292
+ <span class='ivar'>@persona</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='id identifier rubyid_params'>params</span><span class='lbracket'>[</span><span class='symbol'>:id</span><span class='rbracket'>]</span><span class='rparen'>)</span>
293
+
294
+ <span class='id identifier rubyid_authorize'>authorize</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
295
+
296
+ <span class='id identifier rubyid_subscribe_record'>subscribe_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
297
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
298
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
299
+ <span class='kw'>end</span>
300
+ <span class='kw'>end</span>
301
+
302
+ <span class='comment'># POST /api/plans/1/personas.json
303
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_create'>create</span>
304
+ <span class='id identifier rubyid_authorize'>authorize</span><span class='lparen'>(</span><span class='const'>Persona</span><span class='rparen'>)</span>
305
+
306
+ <span class='ivar'>@persona</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_persona_params'>persona_params</span><span class='rparen'>)</span>
307
+
308
+ <span class='id identifier rubyid_subscribe_record'>subscribe_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
309
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
310
+ <span class='kw'>if</span> <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_save'>save</span>
311
+ <span class='id identifier rubyid_subscribe_record'>subscribe_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
312
+ <span class='id identifier rubyid_publish_scope'>publish_scope</span><span class='lparen'>(</span><span class='const'>Persona</span><span class='comma'>,</span> <span class='symbol'>:all</span><span class='rparen'>)</span>
313
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_render'>render</span> <span class='symbol'>:show</span><span class='comma'>,</span> <span class='label'>status:</span> <span class='symbol'>:created</span> <span class='rbrace'>}</span>
314
+ <span class='kw'>else</span>
315
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_render'>render</span> <span class='label'>json:</span> <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_errors'>errors</span><span class='comma'>,</span> <span class='label'>status:</span> <span class='symbol'>:unprocessable_entity</span> <span class='rbrace'>}</span>
316
+ <span class='kw'>end</span>
317
+ <span class='kw'>end</span>
318
+ <span class='kw'>end</span>
319
+
320
+ <span class='comment'># PATCH/PUT /api/personas/1.json
321
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_update'>update</span>
322
+ <span class='ivar'>@persona</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='id identifier rubyid_params'>params</span><span class='lbracket'>[</span><span class='symbol'>:id</span><span class='rbracket'>]</span><span class='rparen'>)</span>
323
+ <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_assign_attributes'>assign_attributes</span><span class='lparen'>(</span><span class='id identifier rubyid_persona_params'>persona_params</span><span class='rparen'>)</span>
324
+
325
+ <span class='id identifier rubyid_authorize'>authorize</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
326
+
327
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
328
+ <span class='kw'>if</span> <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_update'>update</span><span class='lparen'>(</span><span class='id identifier rubyid_persona_params'>persona_params</span><span class='rparen'>)</span>
329
+ <span class='id identifier rubyid_pub_sub_record'>pub_sub_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
330
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_render'>render</span> <span class='symbol'>:show</span><span class='comma'>,</span> <span class='label'>status:</span> <span class='symbol'>:ok</span> <span class='rbrace'>}</span>
331
+ <span class='kw'>else</span>
332
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_render'>render</span> <span class='label'>json:</span> <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_errors'>errors</span><span class='comma'>,</span> <span class='label'>status:</span> <span class='symbol'>:unprocessable_entity</span> <span class='rbrace'>}</span>
333
+ <span class='kw'>end</span>
334
+ <span class='kw'>end</span>
335
+ <span class='kw'>end</span>
336
+
337
+ <span class='comment'># DELETE /personas/1.json
338
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_destroy'>destroy</span>
339
+ <span class='ivar'>@persona</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='id identifier rubyid_params'>params</span><span class='lbracket'>[</span><span class='symbol'>:id</span><span class='rbracket'>]</span><span class='rparen'>)</span>
340
+ <span class='comment'># authorize @persona
341
+ </span>
342
+ <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_destroy'>destroy</span>
343
+ <span class='id identifier rubyid_publish_record'>publish_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
344
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
345
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_head'>head</span> <span class='symbol'>:no_content</span> <span class='rbrace'>}</span>
346
+ <span class='kw'>end</span>
347
+ <span class='kw'>end</span>
348
+
349
+ <span class='id identifier rubyid_private'>private</span>
350
+
351
+ <span class='kw'>def</span> <span class='id identifier rubyid_persona_params'>persona_params</span>
352
+ <span class='id identifier rubyid_permitted_keys'>permitted_keys</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_attribute_names'>attribute_names</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:to_sym</span><span class='rparen'>)</span>
353
+ <span class='qsymbols_beg'>%i[</span><span class='tstring_content'>id</span><span class='words_sep'> </span><span class='tstring_content'>created_at</span><span class='words_sep'> </span><span class='tstring_content'>updated_at</span><span class='tstring_end'>]</span></span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='op'>|</span>
354
+ <span class='id identifier rubyid_permitted_keys'>permitted_keys</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
355
+ <span class='kw'>end</span>
356
+ <span class='id identifier rubyid_params'>params</span><span class='period'>.</span><span class='id identifier rubyid_require'>require</span><span class='lparen'>(</span><span class='symbol'>:data</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_permit'>permit</span><span class='lparen'>(</span><span class='id identifier rubyid_permitted_keys'>permitted_keys</span><span class='rparen'>)</span>
357
+ <span class='kw'>end</span>
358
+ <span class='kw'>end</span>
359
+ <span class='kw'>end</span>
360
+ </code></pre>
361
+ <ul><li>
362
+ <p>Install Redis and add the following to your <code>hyperloop.rb</code></p>
363
+ </li></ul>
364
+
365
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_redis_instance'>redis_instance</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='const'>ENV</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>REDIS_URL</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
366
+ <span class='const'>Redis</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>url:</span> <span class='const'>ENV</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>REDIS_URL</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
367
+ <span class='kw'>else</span>
368
+ <span class='const'>Redis</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
369
+ <span class='kw'>end</span>
370
+ </code></pre>
371
+ <ul><li>
372
+ <p>Add the following to your <code>ApplicationController</code></p>
373
+ </li></ul>
374
+
375
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Hyperloop.html" title="Hyperloop (module)">Hyperloop</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyperloop/Resource.html" title="Hyperloop::Resource (module)">Resource</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyperloop/Resource/PubSub.html" title="Hyperloop::Resource::PubSub (module)">PubSub</a></span></span>
376
+ </code></pre>
377
+ <ul><li>
378
+ <p>Add these routes:</p>
379
+ </li></ul>
380
+
381
+ <pre class="code ruby"><code class="ruby">namespace :api, defaults: { format: :json } do
382
+
383
+ # introspection
384
+ # get &#39;/:model_klass/relations&#39;, to: &#39;relations#index&#39;
385
+ # get &#39;/:model_klass/methods&#39;, to: &#39;methods#index&#39;
386
+ # get &#39;/:model_klass/methods/:id&#39;, to: &#39;methods#show&#39;
387
+ # patch &#39;/:model_klass/methods/:id&#39;, to: &#39;methods#update&#39;
388
+ # get &#39;/:model_klass/properties&#39;, to: &#39;properties#index&#39;
389
+ get &#39;/:model_klass/scopes&#39;, to: &#39;scopes#index&#39;
390
+ get &#39;/:model_klass/scopes/:id&#39;, to: &#39;scopes#show&#39;
391
+ patch &#39;/:model_klass/scopes/:id&#39;, to: &#39;scopes#update&#39;
392
+ </code></pre>
393
+ <ul><li>
394
+ <p>Add the <code>ScopesController</code> as per the example in this Gem</p>
395
+ </li></ul>
182
396
  </div></div>
183
397
 
184
398
  <div id="footer">
185
- Generated on Sun Jun 10 23:20:59 2018 by
399
+ Generated on Tue Aug 14 17:40:31 2018 by
186
400
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
187
401
  0.9.13 (ruby-2.5.1).
188
402
  </div>
data/docs/index.html CHANGED
@@ -68,6 +68,10 @@ clients when using Hyperloop and Rails.</p>
68
68
  <p><a href="http://www.youtube.com/watch?v=fPSpESBbeMQ"><img
69
69
  src="http://img.youtube.com/vi/fPSpESBbeMQ/0.jpg"></a></p>
70
70
 
71
+ <p><a href="https://janbiedermann.github.io/hyper-resource">Documentation</a></p>
72
+
73
+ <p>Supports Pusher and ActionCable (thanks @gabrielrios)</p>
74
+
71
75
  <h2 id="label-Motivation">Motivation</h2>
72
76
  <ul><li>
73
77
  <p>To co-exist with a resource based REST API</p>
@@ -178,11 +182,221 @@ up your code and the client an server can share the same Models.</p>
178
182
 
179
183
  <h2 id="label-Implementation">Implementation</h2>
180
184
 
181
- <p>How to install.…</p>
185
+ <h2 id="label-Implementation">Implementation</h2>
186
+
187
+ <p>Hyperloop needs to be installed and working before you install
188
+ HyperResource. These instructions are likely to change/be simplified as
189
+ this Gem matures.</p>
190
+ <ul><li>
191
+ <p>Add the gems (make sure its the latest version)</p>
192
+ </li></ul>
193
+
194
+ <p><code>gem &#39;hyper-resource&#39;, &#39;1.0.0.lap86&#39;</code> <code>gem
195
+ &#39;opal-jquery&#39;, github: &#39;janbiedermann/opal-jquery&#39;, branch:
196
+ &#39;why_to_n&#39;</code> <code>gem &#39;opal-activesupport&#39;, github:
197
+ &#39;opal/opal-activesupport&#39;, branch: &#39;master&#39;</code></p>
198
+ <ul><li>
199
+ <p>Require HyperResource in your <code>hyperloop_webpack_loader.rb</code> file</p>
200
+ </li></ul>
201
+
202
+ <p><code>require &#39;hyper-resource&#39;</code> <code>require
203
+ &#39;opal-jquery&#39;</code></p>
204
+ <ul><li>
205
+ <p>Update your <code>application_record.rb</code> file and move it to the
206
+ <code>hyperloop/models</code> folder</p>
207
+ </li></ul>
208
+
209
+ <p><code> # application_record.rb if RUBY_ENGINE == &#39;opal&#39; class
210
+ ApplicationRecord def self.inherited(base)
211
+ base.include(HyperRecord) end end else class ApplicationRecord &lt;
212
+ ActiveRecord::Base # when updating this part, also update the
213
+ ApplicationRecord in app/models/application_record.rb # for rails eager
214
+ loading in production, so production doesn&#39;t fail
215
+ self.abstract_class = true extend HyperRecord::ServerClassMethods
216
+ include HyperRecord::PubSub end end </code></p>
217
+ <ul><li>
218
+ <p>Move the models you want on the client to the <code>hyperloop/models</code>
219
+ folder</p>
220
+ </li><li>
221
+ <p>Make sure you guard anything in your model which you do not want on the
222
+ client:</p>
223
+ </li></ul>
224
+
225
+ <pre class="code ruby"><code class="ruby"><span class='kw'>unless</span> <span class='const'>RUBY_ENGINE</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>opal</span><span class='tstring_end'>&#39;</span></span>
226
+ <span class='comment'># herein stuff that you do not want on the client (Devise, etc)
227
+ </span><span class='kw'>end</span>
228
+ </code></pre>
229
+ <ul><li>
230
+ <p>Add Pusher to your gemfile</p>
231
+ </li></ul>
232
+
233
+ <p><code>gem pusher</code></p>
234
+ <ul><li>
235
+ <p>Add it with Yarn</p>
236
+ </li></ul>
237
+
238
+ <p><code>yarn add pusher-js</code></p>
239
+ <ul><li>
240
+ <p>Then import in your <code>app.js</code></p>
241
+ </li></ul>
242
+
243
+ <p><code>import Pusher from &#39;pusher-js&#39;;</code> <code>global.Pusher =
244
+ Pusher;</code></p>
245
+ <ul><li>
246
+ <p>Add your api endpoint to <code>hyperloop.rb</code></p>
247
+ </li></ul>
248
+
249
+ <p><code>config.resource_api_base_path = &#39;/api&#39;</code></p>
250
+ <ul><li>
251
+ <p>Create you API controllers as normal - ensure they return JSON in this
252
+ format</p>
253
+ </li></ul>
254
+
255
+ <pre class="code ruby"><code class="ruby"><span class='lbrace'>{</span>
256
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>members</span><span class='label_end'>&quot;:</span><span class='lbracket'>[</span>
257
+ <span class='lbrace'>{</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>member</span><span class='label_end'>&quot;:</span><span class='lbrace'>{</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>id</span><span class='label_end'>&quot;:</span><span class='int'>1</span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>email</span><span class='label_end'>&quot;:</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>a@b.com</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>first_name</span><span class='label_end'>&quot;:</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>John</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>last_name</span><span class='label_end'>&quot;:</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Smith</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='rbrace'>}</span><span class='comma'>,</span>
258
+ <span class='lbrace'>{</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>member</span><span class='label_end'>&quot;:</span><span class='lbrace'>{</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>id</span><span class='label_end'>&quot;:</span><span class='int'>2</span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>email</span><span class='label_end'>&quot;:</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>b@c.com</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>first_name</span><span class='label_end'>&quot;:</span><span class='id identifier rubyid_null'>null</span><span class='comma'>,</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>last_name</span><span class='label_end'>&quot;:</span><span class='id identifier rubyid_null'>null</span><span class='rbrace'>}</span><span class='rbrace'>}</span>
259
+ <span class='rbracket'>]</span>
260
+ <span class='rbrace'>}</span>
261
+ </code></pre>
262
+
263
+ <p>Rabl gem example view:</p>
264
+
265
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_collection'>collection</span> <span class='ivar'>@members</span><span class='comma'>,</span> <span class='label'>root:</span> <span class='symbol'>:members</span>
266
+ <span class='id identifier rubyid_attributes'>attributes</span> <span class='symbol'>:id</span><span class='comma'>,</span>
267
+ <span class='symbol'>:email</span><span class='comma'>,</span>
268
+ <span class='symbol'>:first_name</span><span class='comma'>,</span>
269
+ <span class='symbol'>:last_name</span>
270
+ </code></pre>
271
+ <ul><li>
272
+ <p>Create your API controller and make sure to implement <code>show</code> as
273
+ this is called by HyperResource. Please see the example controller below
274
+ for details on pub_sub</p>
275
+ </li></ul>
276
+
277
+ <pre class="code ruby"><code class="ruby"><span class='kw'>module</span> <span class='const'>Api</span>
278
+ <span class='kw'>class</span> <span class='const'>PersonasController</span> <span class='op'>&lt;</span> <span class='const'>ApplicationController</span>
279
+ <span class='comment'># GET /api/personas.json
280
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_index'>index</span>
281
+ <span class='id identifier rubyid_authorize'>authorize</span><span class='lparen'>(</span><span class='const'>Persona</span><span class='rparen'>)</span>
282
+
283
+ <span class='ivar'>@personas</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_all'>all</span>
284
+ <span class='id identifier rubyid_subscribe_scope'>subscribe_scope</span><span class='lparen'>(</span><span class='ivar'>@personas</span><span class='comma'>,</span> <span class='const'>Persona</span><span class='comma'>,</span> <span class='symbol'>:all</span><span class='rparen'>)</span>
285
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
286
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
287
+ <span class='kw'>end</span>
288
+ <span class='kw'>end</span>
289
+
290
+ <span class='comment'># GET /api/personas/123.json
291
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_show'>show</span>
292
+ <span class='ivar'>@persona</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='id identifier rubyid_params'>params</span><span class='lbracket'>[</span><span class='symbol'>:id</span><span class='rbracket'>]</span><span class='rparen'>)</span>
293
+
294
+ <span class='id identifier rubyid_authorize'>authorize</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
295
+
296
+ <span class='id identifier rubyid_subscribe_record'>subscribe_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
297
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
298
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
299
+ <span class='kw'>end</span>
300
+ <span class='kw'>end</span>
301
+
302
+ <span class='comment'># POST /api/plans/1/personas.json
303
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_create'>create</span>
304
+ <span class='id identifier rubyid_authorize'>authorize</span><span class='lparen'>(</span><span class='const'>Persona</span><span class='rparen'>)</span>
305
+
306
+ <span class='ivar'>@persona</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_persona_params'>persona_params</span><span class='rparen'>)</span>
307
+
308
+ <span class='id identifier rubyid_subscribe_record'>subscribe_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
309
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
310
+ <span class='kw'>if</span> <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_save'>save</span>
311
+ <span class='id identifier rubyid_subscribe_record'>subscribe_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
312
+ <span class='id identifier rubyid_publish_scope'>publish_scope</span><span class='lparen'>(</span><span class='const'>Persona</span><span class='comma'>,</span> <span class='symbol'>:all</span><span class='rparen'>)</span>
313
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_render'>render</span> <span class='symbol'>:show</span><span class='comma'>,</span> <span class='label'>status:</span> <span class='symbol'>:created</span> <span class='rbrace'>}</span>
314
+ <span class='kw'>else</span>
315
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_render'>render</span> <span class='label'>json:</span> <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_errors'>errors</span><span class='comma'>,</span> <span class='label'>status:</span> <span class='symbol'>:unprocessable_entity</span> <span class='rbrace'>}</span>
316
+ <span class='kw'>end</span>
317
+ <span class='kw'>end</span>
318
+ <span class='kw'>end</span>
319
+
320
+ <span class='comment'># PATCH/PUT /api/personas/1.json
321
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_update'>update</span>
322
+ <span class='ivar'>@persona</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='id identifier rubyid_params'>params</span><span class='lbracket'>[</span><span class='symbol'>:id</span><span class='rbracket'>]</span><span class='rparen'>)</span>
323
+ <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_assign_attributes'>assign_attributes</span><span class='lparen'>(</span><span class='id identifier rubyid_persona_params'>persona_params</span><span class='rparen'>)</span>
324
+
325
+ <span class='id identifier rubyid_authorize'>authorize</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
326
+
327
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
328
+ <span class='kw'>if</span> <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_update'>update</span><span class='lparen'>(</span><span class='id identifier rubyid_persona_params'>persona_params</span><span class='rparen'>)</span>
329
+ <span class='id identifier rubyid_pub_sub_record'>pub_sub_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
330
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_render'>render</span> <span class='symbol'>:show</span><span class='comma'>,</span> <span class='label'>status:</span> <span class='symbol'>:ok</span> <span class='rbrace'>}</span>
331
+ <span class='kw'>else</span>
332
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_render'>render</span> <span class='label'>json:</span> <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_errors'>errors</span><span class='comma'>,</span> <span class='label'>status:</span> <span class='symbol'>:unprocessable_entity</span> <span class='rbrace'>}</span>
333
+ <span class='kw'>end</span>
334
+ <span class='kw'>end</span>
335
+ <span class='kw'>end</span>
336
+
337
+ <span class='comment'># DELETE /personas/1.json
338
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_destroy'>destroy</span>
339
+ <span class='ivar'>@persona</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='id identifier rubyid_params'>params</span><span class='lbracket'>[</span><span class='symbol'>:id</span><span class='rbracket'>]</span><span class='rparen'>)</span>
340
+ <span class='comment'># authorize @persona
341
+ </span>
342
+ <span class='ivar'>@persona</span><span class='period'>.</span><span class='id identifier rubyid_destroy'>destroy</span>
343
+ <span class='id identifier rubyid_publish_record'>publish_record</span><span class='lparen'>(</span><span class='ivar'>@persona</span><span class='rparen'>)</span>
344
+ <span class='id identifier rubyid_respond_to'>respond_to</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_format'>format</span><span class='op'>|</span>
345
+ <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_head'>head</span> <span class='symbol'>:no_content</span> <span class='rbrace'>}</span>
346
+ <span class='kw'>end</span>
347
+ <span class='kw'>end</span>
348
+
349
+ <span class='id identifier rubyid_private'>private</span>
350
+
351
+ <span class='kw'>def</span> <span class='id identifier rubyid_persona_params'>persona_params</span>
352
+ <span class='id identifier rubyid_permitted_keys'>permitted_keys</span> <span class='op'>=</span> <span class='const'>Persona</span><span class='period'>.</span><span class='id identifier rubyid_attribute_names'>attribute_names</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:to_sym</span><span class='rparen'>)</span>
353
+ <span class='qsymbols_beg'>%i[</span><span class='tstring_content'>id</span><span class='words_sep'> </span><span class='tstring_content'>created_at</span><span class='words_sep'> </span><span class='tstring_content'>updated_at</span><span class='tstring_end'>]</span></span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='op'>|</span>
354
+ <span class='id identifier rubyid_permitted_keys'>permitted_keys</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
355
+ <span class='kw'>end</span>
356
+ <span class='id identifier rubyid_params'>params</span><span class='period'>.</span><span class='id identifier rubyid_require'>require</span><span class='lparen'>(</span><span class='symbol'>:data</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_permit'>permit</span><span class='lparen'>(</span><span class='id identifier rubyid_permitted_keys'>permitted_keys</span><span class='rparen'>)</span>
357
+ <span class='kw'>end</span>
358
+ <span class='kw'>end</span>
359
+ <span class='kw'>end</span>
360
+ </code></pre>
361
+ <ul><li>
362
+ <p>Install Redis and add the following to your <code>hyperloop.rb</code></p>
363
+ </li></ul>
364
+
365
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_redis_instance'>redis_instance</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='const'>ENV</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>REDIS_URL</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
366
+ <span class='const'>Redis</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='label'>url:</span> <span class='const'>ENV</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>REDIS_URL</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
367
+ <span class='kw'>else</span>
368
+ <span class='const'>Redis</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
369
+ <span class='kw'>end</span>
370
+ </code></pre>
371
+ <ul><li>
372
+ <p>Add the following to your <code>ApplicationController</code></p>
373
+ </li></ul>
374
+
375
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Hyperloop.html" title="Hyperloop (module)">Hyperloop</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyperloop/Resource.html" title="Hyperloop::Resource (module)">Resource</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Hyperloop/Resource/PubSub.html" title="Hyperloop::Resource::PubSub (module)">PubSub</a></span></span>
376
+ </code></pre>
377
+ <ul><li>
378
+ <p>Add these routes:</p>
379
+ </li></ul>
380
+
381
+ <pre class="code ruby"><code class="ruby">namespace :api, defaults: { format: :json } do
382
+
383
+ # introspection
384
+ # get &#39;/:model_klass/relations&#39;, to: &#39;relations#index&#39;
385
+ # get &#39;/:model_klass/methods&#39;, to: &#39;methods#index&#39;
386
+ # get &#39;/:model_klass/methods/:id&#39;, to: &#39;methods#show&#39;
387
+ # patch &#39;/:model_klass/methods/:id&#39;, to: &#39;methods#update&#39;
388
+ # get &#39;/:model_klass/properties&#39;, to: &#39;properties#index&#39;
389
+ get &#39;/:model_klass/scopes&#39;, to: &#39;scopes#index&#39;
390
+ get &#39;/:model_klass/scopes/:id&#39;, to: &#39;scopes#show&#39;
391
+ patch &#39;/:model_klass/scopes/:id&#39;, to: &#39;scopes#update&#39;
392
+ </code></pre>
393
+ <ul><li>
394
+ <p>Add the <code>ScopesController</code> as per the example in this Gem</p>
395
+ </li></ul>
182
396
  </div></div>
183
397
 
184
398
  <div id="footer">
185
- Generated on Sun Jun 10 23:20:59 2018 by
399
+ Generated on Tue Aug 14 17:40:30 2018 by
186
400
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
187
401
  0.9.13 (ruby-2.5.1).
188
402
  </div>