Skip to content

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.
...
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.