Yeah, this is indeed a bug. I've pushed a fix, which'll be released in 2.2.9, which I'll probably put out this weekend.
On Wed, Oct 14, 2009 at 10:13 AM, David Blondeau <[email protected]>wrote: > Nathan, > > I understand having nested capture and capture_haml is not the best and we > usually try not to do it. > > We have some custom generic view helpers for our application that generate > in place editing of data section (one data section has a link to edit that > section. That section is replaced (hide/show) on click by a form). > To generate those, we need to capture the result of the rails form_for and > remote_form_for helper methods. The content of that being defined in the > Haml template, we need to capture_haml it... > > Something reading like that: > > = editable_data(person, ...) do |panel| > - panel.show_data_table do |table| > = table.row(:first_name) > = table.row(:last_name) > ... > > - panel.edit(...) do |form| > = form.errors > %table > %tbody > = form.row(:first_name) > = form.row(:last_name) > ... > > Still, 2.0 works fine with those nested capture and capture_haml. It would > be nice if we can get 2.2 to do it as well. > > Any idea why _erbout and _hamlout.buffer are out of sync in the example I > gave in the original post? > Would it be OK to use _hamlout.buffer in place of _erbout in push_script? > > Thanks, > David > > > On Wed, Oct 14, 2009 at 9:07 AM, Nathan Weizenbaum <[email protected]>wrote: > >> Why are you mixing #capture and #capture_haml? That seems like a recipe >> for trouble, and indeed seems to be what's causing this particular issue. >> >> >> On Tue, Oct 13, 2009 at 8:34 PM, David <[email protected]> wrote: >> >>> >>> Hi, >>> >>> We are upgrading the Haml library (from 2.0.7 to 2.2.8) used for our >>> Rails (2.2.3) application >>> We are seeing an issue where the result of a script ( = helper_method >>> (...) ) is appended to the wrong buffer in a specific case. >>> >>> Here is a simple example that reproduces the issue (the actual logic >>> is actually spread over several helper methods like form helpers and >>> other view helpers): >>> >>> In ApplicationHelper >>> def nested_captures >>> capture do >>> capture_haml do >>> haml_concat "start" >>> haml_concat(capture_haml { >>> haml_concat "yeah" >>> yield(self) >>> }) >>> haml_concat "end" >>> end >>> end >>> end >>> >>> >>> And in the Haml template: >>> .section >>> .message >>> = nested_captures do |template| >>> foo >>> = succeed(",") do >>> bar >>> >>> With 2.2.8, we are getting: >>> <div class='section'> >>> <div class='message'> >>> bar, start >>> yeah >>> foo >>> >>> >>> end >>> </div> >>> </div> >>> >>> Looking at precompiler.rb, at the end of push_script: >>> push_and_tabulate([:loud, "_erbout << #{no_format ? "# >>> {output_temp}.to_s;" : out}", >>> !(opts[:in_tag] || opts[:nuke_inner_whitespace] || @options >>> [:ugly])]) >>> >>> If we replace _erbout by _hamlout.buffer (like it was in 2.0.7) >>> push_and_tabulate([:loud, "__hamlout.buffer << #{no_format ? "# >>> {output_temp}.to_s;" : out}", >>> !(opts[:in_tag] || opts[:nuke_inner_whitespace] || @options >>> [:ugly])]) >>> >>> then we get the expected result >>> <div class='section'> >>> <div class='message'> >>> >>> start >>> yeah >>> foo >>> bar, >>> >>> end >>> </div> >>> </div> >>> >>> This seems to indicate that _erbout is not set correctly for the = >>> succeed... . >>> Not sure why _erbout != _hamlout.buffer at that point but thought I >>> would ask if someone can shed some light on the issue before we dig >>> further. >>> >>> Thanks, >>> David >>> >>> >>> > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Haml" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/haml?hl=en -~----------~----~----~----~------~----~------~--~---
