はしばみあきら blog

プログラミングアウトプットするブログ。202010スタート

【Ruby】【Rails】自作カレンダーで、月や週を切り替える

昨日、今月1ヶ月の表示をするカレンダーを作成しました。

今回は、今月から見て翌月や先月、またはさらにその先の配列を取得できるようにしていきます。

前回のコードに付け足していくので、もしよかったらそちらもご覧下さい。
【Rails】【Ruby】Dateを使って今月の日数を配列にして表示

月や週を切り替える

最初にどうやって実装しようか?を考えます。

今回はviewに翌月、前月に移動するリンクを作成し、クリックによってパラメータを変化させ、その分だけ移動させるようにします。

完成形はこんな感じで

まずは翌月、前月のリンクを作ります。

span = link_to "Prev", workdays_month_path(p: @x)
span = link_to "Next", workdays_month_path(n: @x)

パラメターとして、前月はpを、翌月はnを渡します。

リンク先は同じviewにして、パラメーターだけ更新します。

コントローラーでパラメーターを受け取ります。

  def month

    if params[:n].present?
      @x = params[:n].to_i + 1
    elsif params[:p].present?
      @x = params[:p].to_i - 1
    else
      @x = 0
    end
    
    # 現在の曜日と年月日
    @date_now = Date.current.months_since(@x)

    @weeks = ["", "", "", "", "", "", ""]

    firstDay = @date_now.beginning_of_month
    firstDayIndex = firstDay.wday
    @calender = Array.new(35){|i| firstDay + (i - firstDayIndex)}

    @workers = Worker.all

  end

そのままのリンクでパラメーターが何もない時は @x には 0 を入れます。

翌月のリンクが押されたらnを渡して、nが渡されたらパラメータに1を足して @x に代入します。

前月のリンクは逆に、@x を−1しています。

この @x を変化させることで、現在からxヶ月前後を取得します。

Date.current.months_since(@x)

months_since は引数の分の月を取得します。

( ) の中身が1なら1ヶ月後、−1なら1ヶ月前を現在の日時から取得します。

基本的にはこれだけで動くようになります。

viewはまだ作りかけですがこんな感じになってます。

span = link_to "Prev", workdays_month_path(p: @x)
span = link_to "Next", workdays_month_path(n: @x)

#workdays-month
  table
    thead
      tr
        th 月日
        - @calender.each do |c|
          - if c.day == 1
            td = "#{c.strftime("%m")}/#{c.strftime("%d")}"
          - else
            td = "#{c.day}"

    thead
      tr
        th 曜日
        - @calender.each do |c|
          td = @weeks[c.wday]

    tbody
      - @workers.each do |w|
        tr
          th = w.name

一応月初の日だけ月も表示させて、それ以外は日付だけ表示するようにしました。

またボチボチ更新していきます。