merge layouts css and js on page render
Hesham E
committed Oct 01, 2010
commit eead1f23ff0910d9bbc41b51b98156d6321bd470
Showing 9
changed files with
85 additions
and 24 deletions
Gemfile
+1
-1
| @@ | @@ -4,4 +4,4 @@ gem 'rails', '3.0.0' |
| gem 'sqlite3-ruby', :require => 'sqlite3' | |
| gem 'active_link_to', '>=0.0.6' | |
| gem 'paperclip', '>=2.3.3' | |
| - | gem 'mime-types', :require => 'mime/types' |
| + | gem 'mime-types', :require => 'mime/types' |
| \ No newline at end of file | |
app/controllers/cms_content_controller.rb
+11
-7
| @@ | @@ -1,25 +1,29 @@ |
| class CmsContentController < ApplicationController | |
| - | before_filter :load_cms_layout, |
| - | :only => [:render_css, :render_js] |
| + | before_filter :load_cms_page |
| def render_page | |
| # TODO | |
| + | render :text => 'found' |
| end | |
| def render_css | |
| - | send_data @cms_layout.css, :filename => 'styles.css', :type => 'text/css' |
| + | send_data @cms_page.cms_layout.merged_css, |
| + | :filename => 'styles.css', |
| + | :type => 'text/css' |
| end | |
| def render_js | |
| - | send_data @cms_layout.js, :filename => 'jscript.js', :type => 'text/javascript' |
| + | send_data @cms_page.cms_layout.merged_js, |
| + | :filename => 'jscript.js', |
| + | :type => 'text/javascript' |
| end | |
| protected | |
| - | def load_cms_layout |
| - | @cms_layout = CmsLayout.find(params[:id]) |
| + | def load_cms_page |
| + | @cms_page = CmsPage.find_by_full_path!("/#{params[:cms_path]}") |
| rescue ActiveRecord::RecordNotFound | |
| - | render :nothing => true |
| + | render :text => 'Page not found', :status => 404 |
| end | |
| end | |
app/models/cms_layout.rb
+10
-0
| @@ | @@ -38,4 +38,14 @@ class CmsLayout < ActiveRecord::Base |
| end | |
| end | |
| + | def merged_css |
| + | delimeter = '\n/* -------------------- */\n' |
| + | self.ancestors.inject([self.css]){|result, l| result << l.css}.join(delimeter) |
| + | end |
| + | |
| + | def merged_js |
| + | delimeter = '\n// --------------------\n' |
| + | self.ancestors.inject([self.js]){|result, l| result << l.js}.join(delimeter) |
| + | end |
| + | |
| end | |
app/views/cms_admin/pages/_form.html.erb
+0
-1
| @@ | @@ -1,7 +1,6 @@ |
| <%= form.select :cms_layout_id, CmsLayout.options_for_select, {}, 'data-page-id' => @cms_page.id.to_i %> | |
| <%= form.text_field :label, :id => 'slugify' %> | |
| <%= form.text_field :slug, :id => 'slug' %> | |
| - | |
| <%= render :partial => 'form_blocks' %> | |
config/routes.rb
+4
-5
| @@ | @@ -11,11 +11,10 @@ Rails.application.routes.draw do |
| resources :uploads | |
| end | |
| - | scope :path => '/layouts/:id', :controller => :cms_content do |
| - | get 'styles.css' => :render_css |
| - | get 'jscript.js' => :render_js |
| + | scope :controller => :cms_content, :path => '(*cms_path)' do |
| + | get '/styles.css' => :render_css |
| + | get '/jscript.js' => :render_js |
| + | get '/' => :render_page |
| end | |
| - | get '*cms_path' => 'cms_content#render_page' |
| - | |
| end | |
test/fixtures/cms_layouts.yml
+15
-2
| @@ | @@ -14,7 +14,7 @@ default: |
| p { color: #fff } | |
| js: |- | |
| $(document).ready(function() { | |
| - | alert('O HAI THAR'); |
| + | alert('hi'); |
| }) | |
| nested: | |
| @@ | @@ -23,10 +23,23 @@ nested: |
| content: |- | |
| <cms:page:header/> | |
| <cms:page:content/> | |
| + | css: |- |
| + | body { background-color: red } |
| + | js: |- |
| + | $(document).ready(function() { |
| + | alert('hi'); |
| + | }) |
| child: | |
| label: Child Layout | |
| parent: nested | |
| content: |- | |
| <cms:page:left_column> | |
| - | <cms:page:right_column> |
| \ No newline at end of file | |
| + | <cms:page:right_column> |
| + | css: |- |
| + | body { p: #fff } |
| + | js: |- |
| + | js: |- |
| + | $(document).ready(function() { |
| + | alert('sup'); |
| + | }) |
| \ No newline at end of file | |
test/fixtures/cms_pages.yml
+9
-0
| @@ | @@ -15,3 +15,12 @@ child: |
| full_path: '/child-page' | |
| children_count: 0 | |
| position: 0 | |
| + | |
| + | with_nested_layout: |
| + | parent: default |
| + | cms_layout: child |
| + | label: Page with nested layout |
| + | slug: 'with-nested_layout' |
| + | full_path: '/with-nested_layout' |
| + | children_count: 0 |
| + | position: 0 |
| \ No newline at end of file | |
test/functional/cms_content_controller_test.rb
+24
-8
| @@ | @@ -2,29 +2,45 @@ require File.dirname(__FILE__) + '/../test_helper' |
| class CmsContentControllerTest < ActionController::TestCase | |
| - | def test_something |
| - | flunk |
| + | def test_render_page |
| + | get :render_page, :cms_path => '' |
| + | assert_equal assigns(:cms_page), cms_pages(:default) |
| + | assert_response :success |
| end | |
| def test_render_css | |
| - | get :render_css, :id => cms_layouts(:default) |
| + | get :render_css, :cms_path => '' |
| assert_response :success | |
| assert_match %r{text\/css}, @response.headers["Content-Type"] | |
| assert_equal cms_layouts(:default).css, @response.body | |
| end | |
| + | def test_render_nested_css |
| + | get :render_css, :cms_path => 'with-nested_layout' |
| + | assert_response :success |
| + | assert_match %r{text\/css}, @response.headers["Content-Type"] |
| + | assert_equal assigns(:cms_page).cms_layout.merged_css, @response.body |
| + | end |
| + | |
| def test_render_js | |
| - | get :render_js, :id => cms_layouts(:default) |
| + | get :render_js, :cms_path => '' |
| assert_response :success | |
| assert_match %r{text\/javascript}, @response.headers["Content-Type"] | |
| assert_equal cms_layouts(:default).js, @response.body | |
| end | |
| - | def test_render_css_and_js_for_nonexistent_layout |
| - | get :render_css, :id => 'bogus' |
| - | assert_response :success |
| - | get :render_js, :id => 'bogus' |
| + | def test_render_nested_js |
| + | get :render_js, :cms_path => 'with-nested_layout' |
| assert_response :success | |
| + | assert_match %r{text\/javascript}, @response.headers["Content-Type"] |
| + | assert_equal assigns(:cms_page).cms_layout.merged_js, @response.body |
| + | end |
| + | |
| + | def test_render_css_and_js_for_nonexistent_layout |
| + | get :render_css, :cms_path => 'bogus' |
| + | assert_response 404 |
| + | get :render_js, :cms_path => 'bogus' |
| + | assert_response 404 |
| end | |
| end | |
test/unit/cms_layout_test.rb
+11
-0
| @@ | @@ -30,4 +30,15 @@ class CmsLayoutTest < ActiveSupport::TestCase |
| layout.reload | |
| assert_equal "<cms:page:left_column>\n<cms:page:right_column>", layout.content | |
| end | |
| + | |
| + | def test_merged_css |
| + | merged_css = [cms_layouts(:child).css, cms_layouts(:nested).css].join('\n/* -------------------- */\n') |
| + | assert_equal merged_css, cms_layouts(:child).merged_css |
| + | end |
| + | |
| + | def test_merged_js |
| + | merged_js = [cms_layouts(:child).js, cms_layouts(:nested).js].join('\n// --------------------\n') |
| + | assert_equal merged_js, cms_layouts(:child).merged_js |
| + | end |
| + | |
| end | |