2015-12-30 2 views
1

Как мы можем перейти от date_started до Date.current?Календарь: date_started до Date.current?

Например, этот код имеет значение только date_started для рутина:

routines = current_user.routines.group_by {|i| i.date_started.to_date} 
classes << "completed" if routines.include?(day)  

Но я хотел бы сделать «завершено», который является CSS класса, который делает фон TD синим, работать, как я поясните ниже:

enter image description here

схема

create_table "routines", force: true do |t| 
    t.datetime "date_started" 
    t.string "action" 
    t.integer "user_id" 
end 

Я следил за этим tutorial для создания календаря.

ПОЛНЫЙ calendar_helper.rb

module CalendarHelper 
    def calendar(date = Date.current, &block) 
     Calendar.new(self, date, block).table 
    end 

    class Calendar < Struct.new(:view, :date, :callback) 
     HEADER = %w[Sun Mon Tue Wed Thu Fri Sat] 
     START_DAY = :sunday 

     delegate :content_tag, :current_user, to: :view 

     def past 
     end 

     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 << "lastmonth" if day.month < date.month 
      classes << "nextmonth" if day.month > date.month 
      ### 
      routines = current_user.routines.group_by {|i| i.date_started.to_date} 
      classes << "completed" if routines.include?(day) 
      ### 
      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 

ответ

1

Если я правильно понять, почему не просто проверить, если данный день в календаре попадает в указанный диапазон дат?

контроллер:

@date_started = Date.today - 2.days 
@today = Date.today 
@given_date = Date.yesterday 

HTML:

<td class="<%= 'completed' if @given_date >= @date_started and @given_date <= @today %>"> 

EDIT

Я полагаю, @given_date нужно будет массив, так что каждый день может повторяться в вашем HTML. Непонятно, как написать это, не видя, как вы делаете свой каландр. Но общая идея должна работать.

EDIT2

Учебник HTML-то вроде этого:

<%= calender do |date| %> 
    <%= date.day %> 
    # assuming this is where you add your `completed` css class somehow 
    # check if date.day falls between the @date_started and @today range 
<% end %> 

EDIT3

Хорошо, я понимаю, почему это сбивает с толку в настоящее время. Я думаю, что понимаю. У вас есть много routine объектов, и вы хотите, чтобы любая дата, которая находится между routine.date_started и Date.today, будет выделена синим цветом. Я полагаю, это сработает для вас:

def day_classes(day) 
    classes = [] 
    classes << "lastmonth" if day.month < date.month 
    classes << "nextmonth" if day.month > date.month 
    ### 
    routines = current_user.routines.group_by {|i| i.date_started.to_date} 
    # remove this line: 
    #classes << "completed" if routines.include?(day) 
    # in favor of this line: 
    classes << "completed" if routines.any? {|date_attr, routine_obj| day >= date_attr and day <= Date.today } 
    ### 
    classes.empty? ? nil : classes.join(" ") 
end 
+0

@ AnthonyGalli.com Я не уверен, понимаю ли я, почему это мешает вам делать то, что я говорю. Я буду обновлять на основе вашей ссылки на учебник. –

+0

@ AnthonyGalli.com hmm okay Я обновлю еще раз. –

+0

@ AnthonyGalli.com Ой, моя логика ошибалась, я отредактировал EDIT3, чтобы исправить это. –

Смежные вопросы