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