[haml] Ruby interpolation inside :javascript filter
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:0x0104e1b3d8:0x01074bb420 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+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.
Re: [haml] Ruby interpolation inside :javascript filter
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 codehac...@comcast.netwrote: 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:0x0104e1b3d8:0x01074bb420 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+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.
Re: [haml] Ruby interpolation inside :javascript filter
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 codehac...@comcast.netwrote: 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:0x0104e1b3d8:0x01074bb420 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+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.
Re: [haml] Ruby interpolation inside :javascript filter
Oh, forgot to hand the accumulator back in that inject call. Should look like: mapped_faculties = @faculties.inject({}) { |a, fac| a[fac.id] = {}; a } On Tue, May 21, 2013 at 11:38 AM, Duncan Beevers dun...@dweebd.com 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.comwrote: 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 codehac...@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:0x0104e1b3d8:0x01074bb420 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+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.
Re: [haml] Ruby interpolation inside :javascript filter
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.comjavascript: 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.netjavascript: 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:0x0104e1b3d8:0x01074bb420 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 javascript:. To post to this group, send email to ha...@googlegroups.comjavascript: . 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.
Re: [haml] Ruby interpolation inside :javascript filter
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 codehac...@comcast.netwrote: 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.comwrote: 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.netwrote: 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:0x0104e1b3d8:**0x01074bb420 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=enhttp://groups.google.com/group/haml?hl=en . For more options, visit https://groups.google.com/**groups/opt_outhttps://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.
Re: [haml] Ruby interpolation inside :javascript filter
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.netjavascript: 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.comwrote: 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:0x0104e1b3d8:**0x01074bb420 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=enhttp://groups.google.com/group/haml?hl=en . For more options, visit https://groups.google.com/**groups/opt_outhttps://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.
Re: [haml] Ruby interpolation inside :javascript filter
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.netwrote: 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.netwrote: 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.comwrote: 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:0x0104e1b3d8:**0x**01074bb420 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=enhttp://groups.google.com/group/haml?hl=en . For more options, visit https://groups.google.com/**grou**ps/opt_outhttps://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=enhttp://groups.google.com/group/haml?hl=en . For more options, visit https://groups.google.com/**groups/opt_outhttps://groups.google.com/groups/opt_out . -- You received this message because you are subscribed to the
Re: [haml] Ruby interpolation inside :javascript filter
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.netjavascript: 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.netwrote: 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.comwrote: 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:0x0104e1b3d8:**0x**01074bb420 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=enhttp://groups.google.com/group/haml?hl=en . For more options, visit https://groups.google.com/**grou**ps/opt_outhttps://groups.google.com/groups/opt_out . -- You received this