Hello,
I''m writing a method that builds rss and atom feeds and
I''ve noticed
something strange when I try updating the content array by using a map.
I''m new to ruby and must confess that I don''t know how array
maps work
so well.
I am formatting some of the rss content array by updating it''s contents
w/ a map like so:
[code]
@entities = Space.find :all
@new_entities = @entities.map do |entity|
open_closed = entity.complete? ? "[x] " : "[ ] "
entity.title = open_closed + entity.title
entity.title += ('' due on '' +
local_date_time(entity.due_on)) if
entity.due_on
entity.title += " (#{entity.status_title})"
end if @entities
[/code]
then when I try to use the @new_entities array in the feed, I get an
error
[code]
for entity in @new_entities #-->>error!
xml.item do
xml.title(entity.title)
xml.description(entity.description)
xml.pubDate(entity.date.strftime("%a, %d %b %Y %H:%M:%S %z"))
xml.link("http://www.recentrambles.com/pragmatic/view/" +
entity.id.to_s)
xml.guid("http://www.recentrambles.com/pragmatic/view/" +
entity.id.to_s)
end
end
[/code]
but, if I use the original @entities array it works perfectly
[code]
for entity in @entities #-->>works!
xml.item do
xml.title(entity.title)
xml.description(entity.description)
xml.pubDate(entity.date.strftime("%a, %d %b %Y %H:%M:%S %z"))
xml.link("http://www.recentrambles.com/pragmatic/view/" +
entity.id.to_s)
xml.guid("http://www.recentrambles.com/pragmatic/view/" +
entity.id.to_s)
end
end
[/code]
How, exactly, is that @entities array getting updated by the map?
Thanks for your help!
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
2 things are going on here
1) i don''t believe you are getting back what you think you are getting
back from .map
2) the entity you are working with in your block is the actual entity,
not a copy. so you are basically overwriting your original array of
entities
.map returns a new array based on whatever it is you do in within the block
[1,2,3].map { |x| x*3 } #=> [3,6,9]
in your case the last statement in the block is
entity.title += " (#{entity.status_title})"
so your block is going to return whatever that evaluates to, not the
entity object you are expecting.
in addition, your block is actually overwriting all the values of the
@entities objects you are passing in. if you were to compare the
titles of the @entities objects before and then after .map is called,
you''re going to see that they are different.
ex:
class Thing
attr_accessor :foo
end
a = Thing.new
a.foo = "abc"
b = Thing.new
b.foo = "xyz"
x = [a,b].map { |c| c.foo += " modified" }
a.foo # => "abc modified"
b.foo # => "xyz modified"
x = ["abc modified", "xyz modified"] # you expected this to
be an
array of Thing objects
if you do want to overwrite the attributes of your objects, just use .each
@entities.each do |entity|
...
end
On 1/25/07, Clem Rock
<rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org>
wrote:>
> Hello,
>
> I''m writing a method that builds rss and atom feeds and
I''ve noticed
> something strange when I try updating the content array by using a map.
>
> I''m new to ruby and must confess that I don''t know how
array maps work
> so well.
>
> I am formatting some of the rss content array by updating it''s
contents
> w/ a map like so:
>
> [code]
> @entities = Space.find :all
>
> @new_entities = @entities.map do |entity|
> open_closed = entity.complete? ? "[x] " : "[ ] "
> entity.title = open_closed + entity.title
> entity.title += ('' due on '' +
local_date_time(entity.due_on)) if
> entity.due_on
> entity.title += " (#{entity.status_title})"
> end if @entities
> [/code]
>
> then when I try to use the @new_entities array in the feed, I get an
> error
>
> [code]
> for entity in @new_entities #-->>error!
> xml.item do
> xml.title(entity.title)
> xml.description(entity.description)
> xml.pubDate(entity.date.strftime("%a, %d %b %Y %H:%M:%S %z"))
> xml.link("http://www.recentrambles.com/pragmatic/view/" +
> entity.id.to_s)
> xml.guid("http://www.recentrambles.com/pragmatic/view/" +
> entity.id.to_s)
> end
> end
> [/code]
>
> but, if I use the original @entities array it works perfectly
> [code]
> for entity in @entities #-->>works!
> xml.item do
> xml.title(entity.title)
> xml.description(entity.description)
> xml.pubDate(entity.date.strftime("%a, %d %b %Y %H:%M:%S %z"))
> xml.link("http://www.recentrambles.com/pragmatic/view/" +
> entity.id.to_s)
> xml.guid("http://www.recentrambles.com/pragmatic/view/" +
> entity.id.to_s)
> end
> end
> [/code]
>
>
> How, exactly, is that @entities array getting updated by the map?
>
> Thanks for your help!
>
> --
> Posted via http://www.ruby-forum.com/.
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Chris, Thanks for your help - this is great. Ruby does things I never expect - in the best of ways. Cheers! Chris Hall wrote:> 2 things are going on here > > 1) i don''t believe you are getting back what you think you are getting > back from .map > 2) the entity you are working with in your block is the actual entity, > not a copy. so you are basically overwriting your original array of > entities > > .map returns a new array based on whatever it is you do in within the > block > > [1,2,3].map { |x| x*3 } #=> [3,6,9] > > in your case the last statement in the block is > > entity.title += " (#{entity.status_title})" > > so your block is going to return whatever that evaluates to, not the > entity object you are expecting. > > in addition, your block is actually overwriting all the values of the > @entities objects you are passing in. if you were to compare the > titles of the @entities objects before and then after .map is called, > you''re going to see that they are different. > > ex: > > class Thing > attr_accessor :foo > end > > a = Thing.new > a.foo = "abc" > b = Thing.new > b.foo = "xyz" > > x = [a,b].map { |c| c.foo += " modified" } > a.foo # => "abc modified" > b.foo # => "xyz modified" > x = ["abc modified", "xyz modified"] # you expected this to be an > array of Thing objects > > if you do want to overwrite the attributes of your objects, just use > .each > > @entities.each do |entity| > ... > end-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---