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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

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

Ruby on Rails

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

Q&A

解決済

3回答

2230閲覧

現在時刻を取得してtime型カラムへ保存させたい

sheep1991

総合スコア2

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2020/08/25 08:19

編集2020/08/26 02:32

前提・実現したいこと

Ruby on Rails初心者です。
学習の一貫として勤怠管理アプリを作っています。
現在時刻を取得し、time型カラムへ時刻を保存するためcreateアクションの設定とストロングパラメータの設定を行いました。

Ruby

1def create 2 @time_card = Time.current 3 @time_card = Timecard.create(timecard_params) 4 if @time_card.save 5 redirect_to root_path 6 else 7 render :index 8 end 9 end 10 11 private 12 def timecard_params 13 params.permit(:start_time, :end_time).merge(user_id: current_user.id) 14 end

Ruby

1= form_with(url:"/worktimes", local: true, class: "btn_frame") do |f| 2 =f.submit "出勤", id: "start-btn" 3 =f.submit "退勤", id: "end-btn"

追記(データベース)

Ruby

1class CreateTimecards < ActiveRecord::Migration[6.0] 2 def change 3 create_table :timecards do |t| 4 t.time :start_time 5 t.time :end_time 6 t.references :user, index: true, foreign_key: true 7 end 8 end 9end 10

発生している問題・エラーメッセージ

ビューには出勤ボタンと退勤ボタンがそれぞれあり、出勤ボタンを押すとstart_timeへ、退勤ボタンを押すとend_timeへ保存されるようにしたいのですが、上手くいきません。

試したこと

createアクションにbinding.pryをかけ、paramsを調べたところ、当然、中身がuser_idのみになっており、start_timeとend_timeは存在しませんでした。ここからの対処方法が分からず、何方かご教示頂けますと幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

params[:commit] に "出勤","退勤"が入ってきますから

case params[:commit] when "出勤" ; @timecard[:start_time] = Time.now when "退勤" ; @timecard[:end_time] = Time.now end としてください。 idを指定しているので  "出勤","退勤"ではなく"start-btn" "end-btn" になってるかもしれないので、logみてparams確認してください

投稿2020/08/25 09:48

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sheep1991

2020/08/26 02:22

ありがとうございます。 参考にさせて頂きます。
guest

0

ruby

1= form_with(url:"/worktimes", local: true, class: "btn_frame") do |f| 2 =f.submit "出勤", name: "start_btn" 3 =f.submit "退勤", name: "end_btn"

ruby

1def create 2 @time_card = Timecard.new(timecard_params) 3 4 @timecard.start_time = Time.now if params[:start_btn] 5 @timecard.end_time = Time.now if params[:end_btn] 6 7 if @time_card.save 8 redirect_to root_path 9 else 10 render :index 11 end 12end

nameでいいんじゃないでしょうか

投稿2020/08/26 03:36

編集2020/08/26 04:40
yuichi555

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sheep1991

2020/08/26 04:31

yuichi555様ありがとうございます。 ですが、上記コードでも上手くいきませんでした。 大変恐縮ですが、params[:start_btn]とparams[:end_btn]の部分はstart-btnとend-btnに当たるのではないかと考え、修正してみたのですが、それでもやはり上手くいかずといったところです。
yuichi555

2020/08/26 04:41

↑修正しました
guest

0

ベストアンサー

= form_with(url:"/worktimes", local: true, class: "btn_frame") do |f| =f.submit "出勤", id: "start-btn" =f.submit "退勤", id: "end-btn"
def create @time_card = Timecard.new(timecard_params) case params[:commit] when "出勤" ; @time_card.start_time = Time.now when "退勤" ; @time_card.end_time = Time.now end if @time_card.save redirect_to root_path else render :index end end private def timecard_params params.permit(:start_time, :end_time).merge(user_id: current_user.id) end

ですかね

だめならtypo等を修正して一度質問の内容を整理していただけますか

投稿2020/08/25 08:31

編集2020/08/26 04:38
naokit-dev

総合スコア424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sheep1991

2020/08/25 08:53 編集

naokit-dev様 ご回答頂きありがとうございます。 フォームの内容が空だからparamsはからののでは? すみません。そもそもの解釈が間違っているかもしれませんが、上記の助言を頂き、下記のように記述するべきものかと考え、実装してみたのですが上手くいきませんでした。 =f.submit :start_time value:"出勤", id: "start-btn" =f.submit :end_time value:"退勤", id: "end-btn" これが反映されているのはどの部分ですか? start_timeカラムとend_timeカラムに時刻を保存できた後に、別のビューファイルではあるのですが出勤簿を用意しているので、そちらに反映させるつもりです。
sheep1991

2020/08/26 02:38 編集

winterboum様 ご回答頂きありがとうございます。 頂いた助言を参考に、下記のように修正してみたのですが、start_timeカラムにもend_timeカラムにも時刻が保存されませんでした。 他修正すべき点がございましたら、ご指摘頂けますと幸いです。 def create case params[:commit]  when "start-btn" ; @timecard[:start_time] = Time.now  when "end-btn" ; @timecard[:end_time] = Time.now end @time_card = Timecard.create(timecard_params) if @time_card.save redirect_to root_path else render :index end end
naokit-dev

2020/08/26 02:49 編集

@time_card = Timecard.create(timecard_params) で上書きされているからでは? とおもったら、その上は@timecardですよ
sheep1991

2020/08/26 03:03

あ、本当ですね。 ただ、@timecard[:start_time]を@time_card[:start_time]のように修正し、@time_card = Timecard.create(timecard_params)をコメントアウトした場合としてない場合とで試してみたのですが、それでも上手くいきませんでした。
naokit-dev

2020/08/26 03:29

> "出勤","退勤"ではなく"start-btn" "end-btn" になってるかもしれないので winterboumさんがかいとうされていることは試されましたか?
sheep1991

2020/08/26 05:40

ありがとうございます! 上記のコードで上手くいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問