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 <codehac...@comcast.net>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+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.
>
>
>

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