From: takashikkbn@... Date: 2017-05-18T16:08:27+00:00 Subject: [ruby-core:81226] [Ruby trunk Feature#11575][Rejected] Blocks in ERB don't work as intended? Issue #11575 has been updated by k0kubun (Takashi Kokubun). Tracker changed from Bug to Feature Status changed from Assigned to Rejected > Whitespace isn't the issue here That's wrong. Definitely whitespace matters. If you change to use a following template, you'll get an expected result and ERB and Erubis will work in the same way. ~~~ erb <% return_block { %><% "This should be stored in $results, but not sent to output" %><% } %> <% return_block { %><%= "This should be stored in $results AND sent to output" %><% } %> ~~~ At least for me, this is not a bug but a feature request. I couldn't find any test that ensures the return value for the case that a part of template is captured by a block and it's called. You may be confused with ActionView's features available via yield. And the original behavior you reported is caused by the fact that one String object is shared by all lines generated from ERB's "<%=". That's a very reasonable thing as both ERB and Erubis do. It doesn't make sense to rely on the return value of internal code that touches temporal state of ERB. And a suggested template (embedding meaningless '<% "foo" %>') doesn't seem a reasonable real use case. As one of the ERB maintainers, I reject this proposal. ---------------------------------------- Feature #11575: Blocks in ERB don't work as intended? https://bugs.ruby-lang.org/issues/11575#change-64882 * Author: rohitpaulk (Rohit Kuruvilla) * Status: Rejected * Priority: Normal * Assignee: k0kubun (Takashi Kokubun) * Target version: 2.5 ---------------------------------------- I'm not sure if this is a problem with ERB, but here it goes - ~~~ require 'ERB' require 'Erubis' $results = [] def return_block(&block) result = block.call $results << result return result end erb_template = <<-ERB <% return_block { %> <% "This should be stored in $results, but not sent to output" %> <% } %> <% return_block { %> <%= "This should be stored in $results AND sent to output" %> <% } %> ERB puts "Result of Template is:" puts "---------------------" #puts Erubis::Eruby.new(erb_template).result puts ERB.new(erb_template).result(binding) puts "---------------------" puts "First call to return_block: #{$results[0]}" puts "Second call to return_block: #{$results[1]}" ~~~ I'd expect the output to be ~~~ Result of Template is: --------------------- This should be stored in $results AND sent to output --------------------- First call to return_block: This should be stored in $results, but not sent to output Second call to return_block: This should be stored in $results AND sent to output ~~~ And this is exactly what I get when using `Erubis`. When I use `ERB`, the output I get is - ~~~ Result of Template is: --------------------- This should be stored in $results AND sent to output --------------------- First call to return_block: This should be stored in $results AND sent to output Second call to return_block: This should be stored in $results AND sent to output ~~~ I'm checking this against older ruby versions too, will update with results. -- https://bugs.ruby-lang.org/ Unsubscribe: