Commit c1412005

mo <mo.khan@gmail.com>
2017-09-24 20:21:35
create helper to generate a backbone collection.
1 parent 4887ba5
Changed files (7)
app
assets
javascripts
helpers
models
views
spec
app/assets/javascripts/views/my/cakes/edit_view.js.coffee
@@ -35,7 +35,7 @@ class csx.Views.My.Cakes.EditView extends Marionette.CompositeView
 
   onRender: ->
     @$("#cake_category_id").val(@model.category_id())
-    @ui.tags.tagit({ availableTags: ALL_TAGS })
+    @ui.tags.tagit({ availableTags: csx.Tags.pluck('name') })
     @disableSaveButton()
 
   savedSuccessfully: (cake) =>
app/assets/javascripts/views/my/tutorials/new_view.js.coffee
@@ -36,7 +36,7 @@ class csx.Views.My.Tutorials.NewView extends Marionette.ItemView
       author_url: attributes.provider_url
 
   onRender: ->
-    @ui.tags.tagit({ availableTags: ALL_TAGS })
+    @ui.tags.tagit({ availableTags: csx.Tags.pluck('name') })
 
   validate: ->
     @model.isValid()
app/helpers/application_helper.rb
@@ -38,4 +38,8 @@ module ApplicationHelper
       'info'
     end
   end
+
+  def backbone_collection_for(items)
+    render partial: 'backbone_collection', locals: { items: items }
+  end
 end
app/models/tag.rb
@@ -4,6 +4,6 @@ class Tag
       .joins(:taggings)
       .where(taggings: { context: 'tags' })
       .order(:name)
-      .uniq
+      .distinct
   end
 end
app/views/application/_backbone_collection.html.erb
@@ -0,0 +1,5 @@
+<% cache items do %>
+<%= javascript_tag do %>
+csx.<%= items.name.split('::').last.pluralize %> = new Backbone.Collection(<%= items.to_json.html_safe %>);
+<% end %>
+<% end %>
app/views/my/kitchens/show.html.erb
@@ -1,10 +1,8 @@
 <% provide(:title, "Kitchen") -%>
 <%= content_for :javascript do -%>
+  <%= backbone_collection_for @categories %>
+  <%= backbone_collection_for @tags %>
   <%= javascript_tag do %>
-    csx.Categories = new Backbone.Collection(<%= raw @categories.to_json %>);
-
-    <%# backbone_collection_for @categories %>
-    var ALL_TAGS = <%= raw @tags.pluck(:name) %>;
     csx.initialize({ access_token: '<%= current_user.authentication_token %>' });
   <% end %>
 <% end %>
spec/helpers/application_helper_spec.rb
@@ -1,4 +1,19 @@
 require "rails_helper"
 
 describe ApplicationHelper do
+  describe "#backbone_collection_for" do
+    it 'returns a script with the backbone collection' do
+      categories = Category.all
+      result = helper.backbone_collection_for(categories)
+      expect(result).to include("csx.Categories")
+      expect(result).to include("Backbone.Collection")
+    end
+
+    it 'escapes namespaces correctly' do
+      tags = ActsAsTaggableOn::Tag.all
+      result = helper.backbone_collection_for(tags)
+      expect(result).to include("csx.Tags")
+      expect(result).to include("Backbone.Collection")
+    end
+  end
 end