Skip to content

Commit

Permalink
Add support for compile-time <%= raw %>
Browse files Browse the repository at this point in the history
  • Loading branch information
Yehuda Katz authored and Yehuda Katz committed Feb 1, 2010
1 parent 1adfb92 commit 2092351
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 23 deletions.
6 changes: 5 additions & 1 deletion actionpack/lib/action_view/template/handlers/erb.rb
Expand Up @@ -15,7 +15,11 @@ def add_text(src, text)
end end


def add_expr_literal(src, code) def add_expr_literal(src, code)
src << '@output_buffer << ((' << code << ').to_s);' if code =~ /\s*raw\s+(.*)/
src << "@output_buffer.safe_concat((" << $1 << ").to_s);"
else
src << '@output_buffer << ((' << code << ').to_s);'
end
end end


def add_expr_escaped(src, code) def add_expr_escaped(src, code)
Expand Down
56 changes: 34 additions & 22 deletions actionpack/test/controller/new_base/render_template_test.rb
Expand Up @@ -2,18 +2,19 @@


module RenderTemplate module RenderTemplate
class WithoutLayoutController < ActionController::Base class WithoutLayoutController < ActionController::Base

self.view_paths = [ActionView::FixtureResolver.new( self.view_paths = [ActionView::FixtureResolver.new(
"test/basic.html.erb" => "Hello from basic.html.erb", "test/basic.html.erb" => "Hello from basic.html.erb",
"shared.html.erb" => "Elastica", "shared.html.erb" => "Elastica",
"locals.html.erb" => "The secret is <%= secret %>", "locals.html.erb" => "The secret is <%= secret %>",
"xml_template.xml.builder" => "xml.html do\n xml.p 'Hello'\nend" "xml_template.xml.builder" => "xml.html do\n xml.p 'Hello'\nend",
"with_raw.html.erb" => "Hello <%=raw '<strong>this is raw</strong>' %>"
)] )]

def index def index
render :template => "test/basic" render :template => "test/basic"
end end

def index_without_key def index_without_key
render "test/basic" render "test/basic"
end end
Expand All @@ -25,88 +26,99 @@ def in_top_directory
def in_top_directory_with_slash def in_top_directory_with_slash
render :template => '/shared' render :template => '/shared'
end end

def in_top_directory_with_slash_without_key def in_top_directory_with_slash_without_key
render '/shared' render '/shared'
end end

def with_locals def with_locals
render :template => "locals", :locals => { :secret => 'area51' } render :template => "locals", :locals => { :secret => 'area51' }
end end

def builder_template def builder_template
render :template => "xml_template" render :template => "xml_template"
end end

def with_raw
render :template => "with_raw"
end
end end

class TestWithoutLayout < Rack::TestCase class TestWithoutLayout < Rack::TestCase
testing RenderTemplate::WithoutLayoutController testing RenderTemplate::WithoutLayoutController

test "rendering a normal template with full path without layout" do test "rendering a normal template with full path without layout" do
get :index get :index
assert_response "Hello from basic.html.erb" assert_response "Hello from basic.html.erb"
end end

test "rendering a normal template with full path without layout without key" do test "rendering a normal template with full path without layout without key" do
get :index_without_key get :index_without_key
assert_response "Hello from basic.html.erb" assert_response "Hello from basic.html.erb"
end end

test "rendering a template not in a subdirectory" do test "rendering a template not in a subdirectory" do
get :in_top_directory get :in_top_directory
assert_response "Elastica" assert_response "Elastica"
end end

test "rendering a template not in a subdirectory with a leading slash" do test "rendering a template not in a subdirectory with a leading slash" do
get :in_top_directory_with_slash get :in_top_directory_with_slash
assert_response "Elastica" assert_response "Elastica"
end end

test "rendering a template not in a subdirectory with a leading slash without key" do test "rendering a template not in a subdirectory with a leading slash without key" do
get :in_top_directory_with_slash_without_key get :in_top_directory_with_slash_without_key
assert_response "Elastica" assert_response "Elastica"
end end

test "rendering a template with local variables" do test "rendering a template with local variables" do
get :with_locals get :with_locals
assert_response "The secret is area51" assert_response "The secret is area51"
end end

test "rendering a builder template" do test "rendering a builder template" do
get :builder_template, "format" => "xml" get :builder_template, "format" => "xml"
assert_response "<html>\n <p>Hello</p>\n</html>\n" assert_response "<html>\n <p>Hello</p>\n</html>\n"
end end

test "rendering a template with <%=raw stuff %>" do
get :with_raw

assert_body "Hello <strong>this is raw</strong>"
assert_status 200
end
end end

class WithLayoutController < ::ApplicationController class WithLayoutController < ::ApplicationController
self.view_paths = [ActionView::FixtureResolver.new( self.view_paths = [ActionView::FixtureResolver.new(
"test/basic.html.erb" => "Hello from basic.html.erb", "test/basic.html.erb" => "Hello from basic.html.erb",
"shared.html.erb" => "Elastica", "shared.html.erb" => "Elastica",
"layouts/application.html.erb" => "<%= yield %>, I'm here!", "layouts/application.html.erb" => "<%= yield %>, I'm here!",
"layouts/greetings.html.erb" => "<%= yield %>, I wish thee well." "layouts/greetings.html.erb" => "<%= yield %>, I wish thee well."
)] )]

def index def index
render :template => "test/basic" render :template => "test/basic"
end end

def with_layout def with_layout
render :template => "test/basic", :layout => true render :template => "test/basic", :layout => true
end end

def with_layout_false def with_layout_false
render :template => "test/basic", :layout => false render :template => "test/basic", :layout => false
end end

def with_layout_nil def with_layout_nil
render :template => "test/basic", :layout => nil render :template => "test/basic", :layout => nil
end end

def with_custom_layout def with_custom_layout
render :template => "test/basic", :layout => "greetings" render :template => "test/basic", :layout => "greetings"
end end
end end

class TestWithLayout < Rack::TestCase class TestWithLayout < Rack::TestCase
describe "Rendering with :template using implicit or explicit layout" describe "Rendering with :template using implicit or explicit layout"


Expand Down

0 comments on commit 2092351

Please sign in to comment.