Module: Nested::Angular

Defined in:
lib/nested.rb

Defined Under Namespace

Modules: Sinatra

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



164
165
166
# File 'lib/nested.rb', line 164

def self.extended(base)
  base.send(:extend, Nested::Angular::Sinatra)
end

Instance Method Details

#angular_add_functions(js, resource) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/nested.rb', line 174

def angular_add_functions(js, resource)
  resource.actions.each do |e|
    method, action = e.values_at :method, :action

    fun_name = Nested::JsUtil::generate_function_name(resource, method, action)

    args = Nested::JsUtil::function_arguments(resource)

    route_args = args.inject({}) do |memo, e|
      idx = args.index(e)
      memo[:"#{e}_id"] = "'+(typeof(values[#{idx}]) == 'number' ? values[#{idx}].toString() : values[#{idx}].id)+'"
      memo
    end
    route = "#{self.prefix}" + resource.route(route_args)

    js << "  impl.#{fun_name} = function(#{args.join(',')}){"

    args = args.map{|a| "$q.when(#{a})"}

    js << "    return $q.all([#{args.join(',')}]).then(function(values){" unless args.empty?
    js << (args.length > 1 ? "  " : "") + "    return $http({method: '#{method}', url: '#{route}'})"
    js << "    });" unless args.empty?

    js << "  }"
  end

  resource.resources.each {|r| angular_add_functions(js, r) }
end

#angularize(resource) ⇒ Object



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/nested.rb', line 203

def angularize(resource)
  js = []

  js << "angular.module('Nested-#{resource.name.to_s.gsub(/_/, '-')}', ['ngResource'])"
  js << ".factory('#{resource.name.to_s.camelcase.capitalize}Service', function($http, $q){"

  js << "  var impl = {}"
  angular_add_functions(js, resource)
  js << "  return impl"

  js << "})"

  get "/#{resource.name}.js" do
    content_type :js
    js.join("\n")
  end
end