asset_pipeline_routes 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # asset\_pipeline\_routes
2
+
3
+ Getting your Rails routes into the Rails 3.2 asset pipeline is really easy. Just
4
+ `include Rails.application.routes.url_helpers` and you have all your routes available.
5
+
6
+ But except for hard-coded links this won't help you, because all resource links dynamic params at compile-time to work, like `{:id => 42}`. Without supplying them you won't get anywhere.
7
+
8
+ Heh, you might think! Just call a route helper and pass in a dynamic parameter mapping, like
9
+ `user_path('{{id}}')`. Sadly this won't yield the desired result! Instead of `/users/{{id}}`, you'll be presented with `/users/%7B%7Bid%7D%7D` because you're mapping just got html_escaped!
10
+
11
+ This is where handlebars\_routes\_assets comes to the rescue!
12
+
13
+ # What it does
14
+
15
+ It adds a helper object to your `Sprocket::Context`, called `r`. Using
16
+ `r` you can access all your routes you'd normally do, except that all those route fragments
17
+ are actually changed into Handlebars attribute bindings.
18
+
19
+ Here's an example, assuming you got a routes.rb with
20
+
21
+ resources :users # => yields multiple routes, e.g. /users/:id(.:format)
22
+
23
+ in it. Then, in you're javascript file you'd call `r.users_path` instead of `users_path` to
24
+ get the Handlebars-version:
25
+
26
+ r.user_path # => yields /users/{{id}}
27
+ r.users_path # => yields /users
28
+
29
+ You can even hook up member- or collection routes, whatever you like. Just prefix your routes with `r.` and you can directly use them in your view!
30
+
31
+ Of course, this assumes you want Handlebars.js compatible attribute-bindings. Luckily, the auto-generated mappings should work for Mustache.JS as well ;)
32
+
33
+ # Addendum
34
+
35
+ Now, if you happen to use haml\_assets to be able to use HAML in your asset pipeline, you could easily create forms to be used in Backbone.js or similar - because you can add an url option which correctly binds to your context!
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,9 @@
1
+ module AssetPipelineRoutes
2
+ module RoutesContext
3
+
4
+ def r
5
+ @r ||= ::AssetPipelineRoutes::RoutesHelper.new(Rails.application.routes.routes)
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ require_relative "routes_context"
2
+
3
+ module AssetPipelineRoutes
4
+ class RoutesHelper
5
+ def initialize(routes, default_block = '{{\1}}')
6
+ routes.each do |route|
7
+ next if route.name.nil? # only handle named_routes
8
+
9
+ self.class.instance_eval do
10
+ define_method :"#{route.name}_path" do |id_replacement = default_block|
11
+ proc { |route, mapping| build_url route, mapping }.curry[route].call id_replacement
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ def build_url route, mapping
18
+ route.path.ast.to_s.gsub(/\(\.:\w+\)/,'').gsub(/:(\w+)/, mapping).to_s
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module AssetPipelineRoutes
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,16 @@
1
+ require_relative "asset_pipeline_routes/version"
2
+ require_relative "asset_pipeline_routes/routes_helper"
3
+
4
+ module AssetPipelineRoutes
5
+ class Railtie < ::Rails::Railtie
6
+ initializer "asset_pipeline_routes.environment" do |app|
7
+ ActiveSupport.on_load(:action_view) do
8
+ include ::AssetPipelineRoutes::RoutesContext
9
+
10
+ app.assets.context_class.instance_eval do
11
+ include ::AssetPipelineRoutes::RoutesContext
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ def build_route name, path
4
+ OpenStruct.new({:name => name, :path => OpenStruct.new(:ast => path)})
5
+ end
6
+
7
+ describe AssetPipelineRoutes do
8
+ # the @route property basically describes a RouteSet#routes object
9
+ # as Rails.application.routes.routes[:index] returns it
10
+ describe 'resources#index' do
11
+ before { @route = build_route 'users', '/users(.:format)' }
12
+ subject { AssetPipelineRoutes::RoutesHelper.new [@route] }
13
+
14
+ it { should respond_to(:users_path) }
15
+ its(:users_path) { should eql '/users'}
16
+ it { subject.users_path('\d+').should eql('/users') }
17
+ end
18
+
19
+ describe 'resources#show' do
20
+ before { @route = build_route 'user', '/users/:id(.:format)' }
21
+ subject { AssetPipelineRoutes::RoutesHelper.new [@route] }
22
+
23
+ it { should respond_to(:user_path) }
24
+ its(:user_path) { should eql('/users/{{id}}') }
25
+ it { subject.user_path('\d+').should eql('/users/\d+') }
26
+ end
27
+
28
+ describe 'resources#edit' do
29
+ before { @route = build_route 'edit_user', '/users/:id/edit(.:format)' }
30
+ subject { AssetPipelineRoutes::RoutesHelper.new [@route] }
31
+
32
+ it { should respond_to(:edit_user_path) }
33
+ its(:edit_user_path) { should eql('/users/{{id}}/edit') }
34
+ it { subject.edit_user_path('\d+').should eql('/users/\d+/edit') }
35
+ end
36
+
37
+ describe 'resources without name' do
38
+ before { @route = build_route nil, '/foo' }
39
+ subject { AssetPipelineRoutes::RoutesHelper.new [@route] }
40
+
41
+ it { subject.should_not_receive(:build_url) }
42
+ end
43
+ end
@@ -0,0 +1,7 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+
3
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+
5
+ require 'asset_pipeline_routes/routes_helper'
6
+ require 'rspec'
7
+ require 'ostruct'
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asset_pipeline_routes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Raphael Randschau
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: &70123436899600 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70123436899600
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70123444734540 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70123444734540
36
+ description: Add a routes helper for all asset pipeline needs
37
+ email:
38
+ - nicolai86@me.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - lib/asset_pipeline_routes/routes_context.rb
44
+ - lib/asset_pipeline_routes/routes_helper.rb
45
+ - lib/asset_pipeline_routes/version.rb
46
+ - lib/asset_pipeline_routes.rb
47
+ - spec/asset_pipeline_routes_spec.rb
48
+ - spec/spec_helper.rb
49
+ - README.md
50
+ - Rakefile
51
+ homepage: ''
52
+ licenses: []
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project: asset_pipeline_routes
71
+ rubygems_version: 1.8.15
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: Add a routes helper for all asset pipeline needs
75
+ test_files: []