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