Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: rails/rails
...
head fork: JEG2/rails
Checking mergeability… Don't worry, you can still create the pull request.
  • 1 commit
  • 3 files changed
  • 0 commit comments
  • 1 contributor
Commits on Apr 21, 2012
@JEG2 JEG2 Restoring the '%' trim mode for ERb templates, allowing for a leading…
… percent sign on a line to indicate non-inserted Ruby code.
c734294
View
12 actionpack/CHANGELOG.md
@@ -1,5 +1,17 @@
## Rails 4.0.0 (unreleased) ##
+* Restored support for the "%" ERb/Erubis _trim mode_. This can be activated with:
+
+ config.action_view.erb_trim_mode = "%" # or "%-" whitespace trim
+
+ With that mode active, you can use a single percent sign at the beginning of a line to engage Ruby mode (without inserting results). It allows for template code like this:
+
+ % if current_user.try(:admin?)
+ <%= render "edit_links" %>
+ % end
+
+ *James Edward Gray II*
+
* Add `index` method to FormBuilder class. *Jorge Bejar*
* Remove the leading \n added by textarea on assert_select. *Santiago Pastorino*
View
14 actionpack/lib/action_view/template/handlers/erb.rb
@@ -38,6 +38,10 @@ def add_postamble(src)
end
end
+ class ErubisWithPercentLine < Erubis
+ include ::Erubis::PercentLineEnhancer
+ end
+
class ERB
# Specify trim mode for the ERB compiler. Defaults to '-'.
# See ERB documentation for suitable values.
@@ -77,10 +81,12 @@ def call(template)
# Always make sure we return a String in the default_internal
erb.encode!
- self.class.erb_implementation.new(
- erb,
- :trim => (self.class.erb_trim_mode == "-")
- ).src
+ mode = self.class.erb_trim_mode.to_s
+ implementation = self.class.erb_implementation
+ if mode.include? "%" and implementation == Erubis
+ implementation = ErubisWithPercentLine
+ end
+ implementation.new(erb, :trim => mode.include?("-")).src
end
private
View
54 actionpack/test/template/erb/handlers_test.rb
@@ -0,0 +1,54 @@
+require "abstract_unit"
+
+class HandlersTest < ActiveSupport::TestCase
+ HANDLER = ActionView::Template::Handlers::ERB
+ Template = Struct.new(:source)
+
+ extend ActiveSupport::Testing::Declarative
+
+ test "content is not trimmed without a trim mode" do
+ with_erb_trim_mode nil do
+ assert_equal(" \ntest", render(" <% 'IGNORED' %> \ntest"))
+ end
+ end
+
+ test "content around tags is trimmed if the trim mode includes a dash" do
+ with_erb_trim_mode '-' do
+ assert_equal("test", render(" <% 'IGNORED' %> \ntest"))
+ end
+ end
+
+ test "percent lines are normal content without a trim mode" do
+ with_erb_trim_mode nil do
+ assert_equal( "% if false\noops\n% end\n",
+ render("% if false\noops\n% end\n") )
+ end
+ end
+
+ test "percent lines count as ruby if trim mode includes a percent" do
+ with_erb_trim_mode "%" do
+ assert_equal("", render("% if false\noops\n% end\n"))
+ end
+ end
+
+ test "both trim modes can be used at the same time" do
+ with_erb_trim_mode "%-" do
+ assert_equal( "test", render( "% if false\noops\n% end\n" +
+ " <% 'IGNORED' %> \ntest" ) )
+ end
+ end
+
+ private
+
+ def with_erb_trim_mode(mode)
+ @old_erb_trim_mode = HANDLER.erb_trim_mode
+ HANDLER.erb_trim_mode = mode
+ yield
+ ensure
+ HANDLER.erb_trim_mode = @old_erb_trim_mode
+ end
+
+ def render(template)
+ eval("output_buffer = nil; " + HANDLER.call(Template.new(template)))
+ end
+end

No commit comments for this range

Something went wrong with that request. Please try again.