質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • HTML

    11803questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Ruby

    9615questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9026questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • date

    71questions

    dateは、date型や日付に関する関数や処理についてのタグです

チェックボックスを押されているときに翌日分の時間を足すようにしたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 99

ikt_erk122

score 14

【やりたいこと】
出社・退社時間を編集する機能を追加する勉強をしています。編集する際にチェックボックスを押して編集すると翌日に退社する(24時間後)という機能を追加したいです。

【困っていること】
チェックボックスは実装できているが、翌日の時間を取得する方法や書き方を調べてもわからず押しても何も変わらない状態。
自分の考えはDateクラスのDate.tomorrowを使えばいけるのかなと思っています。

・attendances/edit.html.erb

<%= form_for(@user, url: update_attendances_path, method: :patch) do |f| %>
    <table class = "table-bordered table-striped table-condensed">
      <thead>
        <tr>
          <th>日付</th>
          <th>曜日</th>
          <th>出社時間</th>
          <th>退社時間</th>
          <th>翌日</th>
        </tr>
      </thead>
      <tbody>
        <% @dates.each do |day| %>
          <%= fields_for "attendances[]", day do |af| %>
            <tr>
              <td><%= day.worked_on.to_s(:date) %></td>
              <td><%= %w{日 月 火 水 木 金 土}[day.worked_on.wday] %></td>
              <td>
                <% if day.worked_on > Date.today %>
                  <%= af.time_field :started_at, :readonly => true, class: "form-control" %>
                <% else %>
                  <%= af.time_field :started_at, class: "form-control" %>
                <% end %>  
              </td>
              <td>
                <% if day.worked_on > Date.today %>
                  <%= af.time_field :finished_at, :readonly => true, class: "form-control" %>
                <% else %>
                  <%= af.time_field :finished_at, class: "form-control" %>
                <% end %>  
              </td>
              <td>
                <% if day.worked_on > Date.today %>                            
                <% else %>
                  <%= af.check_box :next_day, {}, "true", "false" %>
                <% end %>
              </td>
            </tr>
          <% end %>
        <% end %>
      </tbody>
    </table>
    <div class="btn-attendances-update">
      <%= f.submit "更新", class: "btn btn-primary" %>
      <%= link_to "キャンセル", user_path(@user, params:{first_day: @first_day }), class: "btn btn-default btn-block" %>
    </div>
  <% end %>


・attedances_controller.rb

class AttendancesController < ApplicationController
  before_action :logged_in_user,  only: :edit
  before_action :general_user,    only: :edit
  before_action :hidden,          only: :edit

  def create
    @user = User.find(params[:user_id])
    @attendance = @user.attendances.find_by(worked_on: Date.today)
    if @attendance.started_at.nil?
      @attendance.update_attributes(started_at: current_time)
      flash[:info] = 'おはようございます。'
    elsif @attendance.finished_at.nil?
      @attendance.update_attributes(finished_at: current_time)
      flash[:info] = 'おつかれさまでした。'
    else
      flash[:danger] = 'トラブルがあり、登録出来ませんでした。'
    end
    redirect_to @user
  end

  def edit
    @user = User.find(params[:id])
    @first_day = first_day(params[:date])
    @last_day = @first_day.end_of_month
    @dates = user_attendances_month_date
  end

  def update   
    @user = User.find(params[:id])
    if attendances_invalid?
      attendances_params.each do |id, item|
        attendance = Attendance.find(id)
        attendance.update_attributes(item)
      end
      flash[:success] = '勤怠情報を更新しました。'
      redirect_to user_path(@user, params:{first_day: params[:date]})
      @tomorrow = Time.now.tomorrow ←追加
    else
      redirect_to edit_attendances_path(@user, params[:date])
    end
  end

  private
    def attendances_params
      params.permit(attendances: [:started_at, :finished_at, :note])[:attendances]
    end

    # ログインしていない一般ユーザーは勤怠編集画面を開けない
    def general_user
      @user = User.find(params[:id])
      if !current_user?(@user) && !current_user.admin?
        redirect_to(root_url)
      end
    end

    # ログイン済みユーザーか確認
    def logged_in_user
      unless logged_in?
        store_location
        flash[:danger] = "ログインしてください。"
        redirect_to login_url
      end
    end

    #管理者は勤怠編集画面の表示禁止
    def hidden
      if current_user.admin?
        redirect_to(root_url)
      end
    end
end


・attendances_helper

def attendances_invalid?
    attendances = true
    attendances_params.each do |id, item|
      if item[:started_at].blank? && item[:finished_at].blank?
        next
      elsif item[:started_at].blank? || item[:finished_at].blank?
        attendances = false
        flash[:danger] = "出社時間または退社時間を入力してください。"
        break
      elsif item[:started_at] > item[:finished_at]
        attendances = false
        flash[:danger] = "出社時間を退社時間より遅い時間に設定することはできません。"
        break
      end
    end
    return attendances
  end
end


・users_controller.rb

class UsersController < ApplicationController


  def new
    @user = User.new
  end

  def show
    @user = User.find(params[:id])
    if params[:first_day].nil?
      @first_day = Date.today.beginning_of_month
    else
      @first_day = Date.parse(params[:first_day])
    end
    @last_day = @first_day.end_of_month
    (@first_day..@last_day).each do |day|
      unless @user.attendances.any? {|attendance| attendance.worked_on == day}
        record = @user.attendances.build(worked_on: day)
        record.save
      end
    end
    @dates = user_attendances_month_date
    @worked_sum = @dates.where.not(started_at: nil).count
    respond_to do |format|
      format.html
      format.csv do
        send_data render_to_string, filename: "#{@user.name}.csv", type: :csv
      end
    end
  end

  def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      flash[:success] = "ユーザーの新規作成に成功しました。"
      redirect_to @user
    else
      render 'new'
    end
    registered_count = import_emails
    redirect_to emails_path, notice: "#{registered_count}件登録しました"
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      flash[:success] = "ユーザー情報を更新しました。"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def index
    if params[:q] && params[:q].reject { |key, value| value.blank? }.present?
      @q = User.ransack(search_params, activated_true: true)
      @title = "検索結果"
    else
      @q = User.ransack(activated_true: true)
      @title = "ユーザー一覧"
    end
    @users = @q.result.paginate(page: params[:page])
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "削除しました。"
    redirect_to users_url
  end

  def edit_index
    @user = User.find(params[:id])
  end

  def update_index
    @user = User.find(params[:id])
    if @user.update_attributes(update_index_params)
      flash[:success] = "更新しました。"
      redirect_to users_url   
    else
      render 'index'
    end
  end  
end


・schema.rb

create_table "attendances", force: :cascade do |t|
    t.date "worked_on"
    t.datetime "started_at"
    t.datetime "finished_at"
    t.string "note"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.datetime "next_day"
    t.index ["user_id"], name: "index_attendances_on_user_id"
  end


・show.html.erb

<% @dates.each do |day| %>
  <%= fields_for "attendances[]", day do |af| %>
  <tr>
    <td><%= day.worked_on.to_s(:date) %></td>
    <td class="<%= css_class %>"><%= %w{日 月 火 水 木 金 土}[day.worked_on.wday] %></td>
    <td><%= day.started_at.to_s(:hour) if day.started_at.present? %></td>
    <td><%= day.started_at.floor_to(15.minutes).to_s(:min) if day.started_at.present? %></td>
    <td>
      <% if day.worked_on == Date.today && day.started_at.nil? %>
        <%= button_to "出社", user_attendances_path(@user), class: "btn btn-xs btn-primary" %>
      <% end %>
    </td>
    <td><%= day.finished_at.to_s(:hour) if day.finished_at.present? %></td>
    <td><%= day.finished_at.floor_to(15.minutes).to_s(:min) if day.finished_at.present? %></td>
    <td>
      <% if day.worked_on == Date.today && day.started_at.present? && day.finished_at.nil? %>
        <%= button_to "退社", user_attendances_path(@user), class: "btn btn-xs btn-primary" %>
      <% end %>
    </td>
  </tr>
  <% end %>
<% end %>


イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

def edit を見ただけでは どこに入れたいのかが分からないのでとりあえず、24時間後の日時を得る方法だけ。
Date ではなく Time です。Dateでは時刻がないので

Time.now.tomorrow

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/08 23:03

    回答ありがとうございます。
    追記でusers_controllerとattendances_controllerを追加しました。
    editアクションにTime.now.tomorrowを書く際にチェックボックスがオンの状態に取得するにかどのように書けばよろしいですか?

    キャンセル

  • 2019/06/09 05:06

    def edit ではなく def update の方ですね。
    log は見てますか? logに Parameters: { 。。。。。 } というのがありますから、そこをみると自ずとわかると思います。

    キャンセル

  • 2019/06/09 15:56

    Started GET "/users/6/attendances/2019-06-01/edit" for 126.2.106.214 at 2019-06-09 15:27:39 +0900
    Cannot render console from 126.2.106.214! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
    Processing by AttendancesController#edit as HTML
    Parameters: {"id"=>"6", "date"=>"2019-06-01"}
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 6], ["LIMIT", 1]]
    User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 6], ["LIMIT", 1]]
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 6], ["LIMIT", 1]]
    Rendering attendances/edit.html.erb within layouts/application
    Attendance Load (0.3ms) SELECT "attendances".* FROM "attendances" WHERE "attendances"."user_id" = ? AND (worked_on >= '2019-06-01' and worked_on <= '2019-06-30') ORDER BY worked_on [["user_id", 6]]
    Rendered attendances/edit.html.erb within layouts/application (12.9ms)
    Rendered layouts/_shim.html.erb (0.3ms)
    Rendered layouts/_header.html.erb (0.9ms)
    Completed 200 OK in 62ms (Views: 55.6ms | ActiveRecord: 0.7ms)

    キャンセル

  • 2019/06/09 16:14

    updateアクションにTime.now.tomorrowを追加しました。viewに書く際にチェックボックスがオンの時に反映させるにはどのように書けばいいでしょか?

    キャンセル

  • 2019/06/09 20:24

    そのlogはeditの時ですね。
    updateの時のParamaterを見て下さい

    キャンセル

  • 2019/06/09 22:02

    Processing by AttendancesController#update as HTML
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"sDgo050bPWePwVXakqTW8UdgOkO/mdm53j9FTQu2nf0OGvhMtDjs47N48VwJw5BKk1+6LYOFoyHjlNJnueCq9Q==", "attendances"=>{"63"=>{"started_at"=>"10:00:00.000", "finished_at"=>"22:00", "next_day"=>"false", "note"=>""}, "64"=>{"started_at"=>"", "finished_at"=>"", "next_day"=>"false", "note"=>""}, "65"=>{"started_at"=>"", "finished_at"=>"", "next_day"=>"false", "note"=>""}, "66"=>{"started_at"=>"", "finished_at"=>"", "next_day"=>"false", "note"=>""}, "67"=>{"started_at"=>"", "finished_at"=>"", "next_day"=>"false", "note"=>""}, "68"=>{"started_at"=>"", "finished_at"=>"", "next_day"=>"false", "note"=>""}, "69"=>{"started_at"=>"", "finished_at"=>"", "next_day"=>"false", "note"=>""}, "70"=>{"started_at"=>"", "finished_at"=>"", "next_day"=>"false", "note"=>""}, "71"=>{"started_at"=>"", "finished_at"=>"", "next_day"=>"false", "note"=>""}, "72"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "73"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "74"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "75"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "76"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "77"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "78"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "79"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "80"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "81"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "82"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "83"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "84"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "85"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "86"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "87"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "88"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "89"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "90"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "91"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}, "92"=>{"started_at"=>"", "finished_at"=>"", "note"=>""}}, "commit"=>"更新", "id"=>"6", "date"=>"2019-06-01"}

    キャンセル

  • 2019/06/09 22:02

    こちらでしょうか?

    キャンセル

  • 2019/06/10 02:13

    そうです。
    チェックを入れた日といれてない日で "next_day"=>"???",が違っているので、それを判断して「翌日に退社する(24時間後)」という措置を行えばよいです。

    キャンセル

  • 2019/06/10 12:16

    if params[:next_day] == true
    Time.now.tomorrow
    end
    と書いてみたのですが、変わらなかったです。書き方が間違っているのでしょうか?
    あと、時間を表示するshow.html.erbを追記しました。7つ目の<td>に翌日分の時間を表示させたいです。

    キャンセル

  • 2019/06/10 12:30

    実はソースを拝見して、どんなふうになってほしいのか、というのが読み取れていません。
    チェックの有無はまず置いておいて、createの完成版(チェックの対応は後)を作って頂けますか?
    そのあとで、チェックがない場合と入った場合で、
     どのモデルのどの項目が、何から何に変わって欲しいのか
    を教えて下さい。

    キャンセル

  • 2019/06/10 15:18

    attendancesコントローラのcreateアクションのことでしょうか?そうだとしたらすでに記載してあります。
    モデルの項目とはなんですか?理解できていなくてすみません

    キャンセル

  • 2019/06/11 18:00

    例えば
    6/7 の 9:45に6/4を編集して実行したとします。
    チェックを入れなかった場合と、入れた場合で
     どのデータの
     どの項目が
     入れなかった場合は「これこれ」だが、
     入れた場合には「こんな風」になってほしい
    のでしょうか

    キャンセル

同じタグがついた質問を見る

  • HTML

    11803questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Ruby

    9615questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9026questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • date

    71questions

    dateは、date型や日付に関する関数や処理についてのタグです