1

请让我知道这些操作之间有什么区别。第一个代码工作正常:

1) for elem in(mr)
     elem.shedule = Date.new(date.year, date.month, date.day)  
   end

但我想使用map

2) mr.map!{ |elem| elem.shedule = Date.new(date.year, date.month, date.day) }  

第二个代码返回错误:

 NoMethodError in Events#index

Showing C:/Sites/calend/app/views/events/_calendar.html.erb where line #9 raised:

undefined method `shedule' for Thu, 04 Apr 2013:Date

Extracted source (around line #9):

6:   </h2>
7:   <%= calendar_for(@repeats, :year => @date.year, :month => @date.month) do |calendar| %>
8:     <%= calendar.head('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday') %>
9:     <%= calendar.day(:day_method => :shedule) do |date, events| %>
10:       <%= date.day %> <%= link_to '+', new_event_path(date: date) %>
11:       <ul>
12:         <% for event in events %>
4

1 回答 1

6

map以错误的方式使用,您应该each改用。您的代码应该是:

mr.each do |elem| 
  elem.shedule = Date.new(date.year, date.month, date.day)
end 

map用块返回的值替换 Array 中的每个元素(请参阅下面的 Linuxios 注释),在您的示例中,该块返回一个 Date 对象。map!在不创建新数组的情况下执行相同的操作,因此在您的示例mr中是日期对象数组而不是事件数组。

此外,for在 Ruby 代码中使用的非常少见,它通常被替换为each因为:

[1, 2, 3].each do |x|
  puts x
end

几乎等同于(有关差异,请参阅 Mladen Jabnović 对此答案的评论):

for x in [1, 2, 3]
  puts x
end

前者被认为更“Rubyish”。

于 2013-04-05T09:54:01.810 回答