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<javascript:>
> > 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>:**0x000001074bb420>
>>>>>
>>>>> 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/**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