Сравните массив дат с одним днем (в календаре рельсов)
Я использую помощника по календарю от Railscast: http://railscasts.com/episodes/213-calendars-revised но у меня возникла проблема (помощник по календарю ниже):
module CalendarHelper
def calendar(date = Date.today, &block)
Calendar.new(self, date, start_date, end_date, scheduled, block).table
end
class Calendar < Struct.new(:view, :date, :start_date, :end_date, :scheduled, :callback)
HEADER = %w[S M T W T F S]
START_DAY = :sunday
delegate :content_tag, to: :view
def table
content_tag :table, class: "calendar" do
header + week_rows
end
end
def header
content_tag :tr do
HEADER.map { |day| content_tag :th, day }.join.html_safe
end
end
def week_rows
weeks.map do |week|
content_tag :tr do
week.map { |day| day_cell(day) }.join.html_safe
end
end.join.html_safe
end
def day_cell(day)
content_tag :td, view.capture(day, &callback), class: day_classes(day)
end
def day_classes(day)
classes = []
classes << "today" if day == Date.today
classes << "start_date" if day == start_date
classes << "end_date" if day == end_date
classes << "notmonth" if day.month != date.month
classes << "scheduled" if day == scheduled
classes.empty? ? nil : classes.join(" ")
end
def weeks
first = date.beginning_of_month.beginning_of_week(START_DAY)
last = date.end_of_month.end_of_week(START_DAY)
(first..last).to_a.in_groups_of(7)
end
end
end
Мое приложение выплевывает массив запланированных дат (используя гем ice_cube). Для каждой из этих дат я хочу сопоставить их с датами из календаря, назначив им класс "запланировано". Я не могу понять, как это сделать. Этот код - то, что я пытаюсь заставить работать:
classes << "scheduled" if day == scheduled
"запланированный" приходит от контроллера:
Application_Controller.rb
def scheduled
Schedule.find(params[:id]).itinerary.all_occurrences if params[:id]
end
helper_method :scheduled
Который возвращает следующий массив дат:
=> [2014-05-16 00:00:00 -0400, 2014-05-19 00:00:00 -0400, 2014-05-20 00:00:00 -0400, 2014-05-21 00:00:00 -0400, 2014-05-22 00:00:00 -0400, 2014-05-23 00:00:00 -0400, 2014-05-26 00:00:00 -0400, 2014-05-27 00:00:00 -0400, 2014-05-28 00:00:00 -0400, 2014-05-29 00:00:00 -0400]
Я попробовал несколько сценариев, но не могу понять это.
Например, это сработает и покажет "запланированный" класс на эти 3 дня, но я не могу понять, как перебрать все запланированные даты и все еще иметь || оператор в блоке:
def day_classes(day)
...
classes << "scheduled" if Date.yesterday == day || Date.tomorrow == day || Date.today == day
...
end
Или, может быть, у кого-то есть идея получше?
1 ответ
После небольшого прочтения драгоценного камня ice_cube я нашел удобный метод, который делает именно то, что мне нужно.
def day_classes(day)
...
classes << "scheduled" if scheduled.itinerary.occurs_on?(day)
...
end