Yes, good idea, that works, except for the error message "illegal nesting: 
nesting within plain text is illegal". This refers to the indentation 
within the js code.

I have ended up with the Ruby code under %script and js code under 
:javascript. Not clean, but a workable interim step. I'll definitely clean 
this up when I can get some jasmine tests running.

Many thanks for your assistance, Duncan.

Les

On Tuesday, May 21, 2013 11:12:42 AM UTC-7, Duncan Beevers wrote:
>
> Well, if the old code works and you're just trying to go from erb->haml, I 
> wouldn't use the `javascript:` filter.
>
> Instead, just translate the tags to haml and treat the javascript like 
> text. Erb interpolation sigils get swapped out for ruby string 
> interpolation sigils, block is automatically closed.
>
> %script
>   var departments = new Object();
>   - @faculties.each do  |fac|
>   departments['#{fac.id}']= new Object();
>
>
>
> On Tue, May 21, 2013 at 1:02 PM, Les Nightingill 
> <codeh...@comcast.net<javascript:>
> > wrote:
>
>> Yes, you're right, Duncan, your previous code does achieve the desired 
>> outcome. Thanks for that.
>>
>> What I posted, though, is a simplified version of the problem. And the js 
>> here does not have tests (yet), so I'm trying to take very small steps to 
>> get green tests. I'm curious if you know a way to directly translate the 
>> erb/js script snippet into haml? If not, I'll follow your suggestion.
>>
>> The problem with poorly tested legacy code is you sometimes have to live 
>> with suboptimal architecture for a while until you can get a good test 
>> suite in place!
>>
>> Thanks for your help
>>
>> Les
>>
>> On Tuesday, May 21, 2013 10:24:49 AM UTC-7, Duncan Beevers wrote:
>>
>>> The code I posted before should do that. The inject call does the same 
>>> object initialization as the javascript you originally posted.
>>>
>>> To be clear, the old haml generated client-side code that looked like 
>>> this:
>>> <script>
>>> var departments = new Object();
>>> departments[9] = new Object();
>>> departments[67] = new Object();
>>> ...
>>> </script>
>>>
>>> After this code was run, the resultant `departments` object would look 
>>> like this:
>>>
>>> departments = { 9: {}, 67: {} };
>>>
>>> The inject code I provided does the same thing except it bypasses 
>>> generation of the client-side javascript and instead generates the 
>>> resultant object as a JavaScript object literal. The new code would look 
>>> like this:
>>>
>>> <script>
>>> var departments = { 9: {}, 67: {} };
>>> ...
>>> </script>
>>>
>>>
>>>
>>> On Tue, May 21, 2013 at 12:00 PM, Les Nightingill 
>>> <codeh...@comcast.net>wrote:
>>>
>>>> Thanks for your suggestions Duncan.
>>>>
>>>> I would most definitely be happier mapping the Ruby variables to JSON 
>>>> in the controller. But I'm in the middle of a large Rails upgrade and I'm 
>>>> hoping to defer such refactoring improvements, at least until I get this 
>>>> view basically working and (important) get the tests all green. My first 
>>>> step is the conversion to haml.
>>>>
>>>> So... given that it's a suboptimal architecture, how can I take this 
>>>> working erb:
>>>>
>>>> <script>
>>>> var departments = new Object()
>>>> <% @faculties.each do  |fac| %>
>>>> departments['<%= fac.id -%>']= new Object()
>>>> <% end %>
>>>> ...
>>>> </script>
>>>>
>>>> and convert it to haml?
>>>>
>>>>
>>>> On Tuesday, May 21, 2013 9:38:38 AM UTC-7, Duncan Beevers wrote:
>>>>
>>>>> You might be happier using Ruby to map your data to JSON, and then 
>>>>> feeding that to your JavaScript, rather than using Ruby to dynamically 
>>>>> generate JavaScript.
>>>>>
>>>>> For example, if you wanted to map the data directly in the view, could 
>>>>> do so like this.
>>>>>
>>>>> - mapped_faculties = @faculties.inject({}) { |a, fac| a[fac.id] = {} }
>>>>> :javascript
>>>>>   var departments = #{mapped_faculties.to_json};
>>>>>
>>>>> In general, I would recommend doing these types of transformations in 
>>>>> the controller rather than in the view itself, but the principle is the 
>>>>> same.
>>>>>
>>>>>
>>>>> On Tue, May 21, 2013 at 11:29 AM, Duncan Beevers <dun...@dweebd.com>wrote:
>>>>>
>>>>>> You're in a javascript filter. The code that you think is iterating 
>>>>>> through @faculties is actually just being inlined as javascript into a 
>>>>>> script tag.
>>>>>>
>>>>>>
>>>>>> On Tue, May 21, 2013 at 11:22 AM, Les Nightingill <
>>>>>> codeh...@comcast.net> wrote:
>>>>>>
>>>>>>>  I have this in a rails view file:
>>>>>>>
>>>>>>> ...
>>>>>>> :javascript
>>>>>>>   var departments = new Object()
>>>>>>>   - @faculties.each do  |fac|
>>>>>>>     departments['#{ fac.id }']= new Object()
>>>>>>>
>>>>>>> And the error message I get is:
>>>>>>>
>>>>>>> undefined local variable or method `fac' for 
>>>>>>> #<#<Class:0x00000104e1b3d8>:**0x**000001074bb420>
>>>>>>>
>>>>>>> I'm clearly missing something very basic. Can anyone see what the 
>>>>>>> problem is, please. Thanks in advance.
>>>>>>>
>>>>>>> Les
>>>>>>>
>>>>>>>  -- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "Haml" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to haml+uns...@googlegroups.**com.
>>>>>>> To post to this group, send email to ha...@googlegroups.com.
>>>>>>>
>>>>>>> Visit this group at 
>>>>>>> http://groups.google.com/**group**/haml?hl=en<http://groups.google.com/group/haml?hl=en>
>>>>>>> .
>>>>>>> For more options, visit 
>>>>>>> https://groups.google.com/**grou**ps/opt_out<https://groups.google.com/groups/opt_out>
>>>>>>> .
>>>>>>>  
>>>>>>>  
>>>>>>>
>>>>>>
>>>>>>
>>>>>  -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Haml" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to haml+uns...@googlegroups.**com.
>>>> To post to this group, send email to ha...@googlegroups.com.
>>>> Visit this group at 
>>>> http://groups.google.com/**group/haml?hl=en<http://groups.google.com/group/haml?hl=en>
>>>> .
>>>> For more options, visit 
>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>> .
>>>>  
>>>>  
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Haml" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to haml+uns...@googlegroups.com <javascript:>.
>> To post to this group, send email to ha...@googlegroups.com <javascript:>
>> .
>> Visit this group at http://groups.google.com/group/haml?hl=en.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>  
>>  
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Haml" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to haml+unsubscr...@googlegroups.com.
To post to this group, send email to haml@googlegroups.com.
Visit this group at http://groups.google.com/group/haml?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to