[RUBY] [Rails] Enregistrer l'heure de début et l'heure de fin

Enregistrer les heures de début et de fin

Dans les rails, créez un programme qui enregistre les heures de début et de fin des tâches. Puisqu'il y a de nombreuses parties de mon propre style, j'apprécierais que vous puissiez vous y référer comme l'une des méthodes.

画面収録 2020-09-25 2.57.23.mov.gif

Façon de penser

Nous visons un mécanisme qui vous permet d'appuyer une seule fois sur les formulaires de début et de fin. Plus précisément, écrivez une instruction if dans la vue afin que le bouton de démarrage ne s'affiche pas lorsque les données d'heure de début de la tâche sont incluses. Le processus qui a conduit à cette idée est le suivant.

-Associer l'heure de début (StartTime) et l'heure de fin (StopTime) à la tâche (Task) → Problème: je peux commencer et terminer autant de fois que je veux. -Lorsque les données StartTime sont entrées (au démarrage), le bouton ne s'affiche pas. ・ L'heure d'arrêt est la même que ci-dessus.

Préparation

Terminal

rails new  _6.0.0_nom de l'application-d mysql
nom de l'application cd
bundle install

Créer un modèle

rails g model task
rails g model start_time
rails g model stop_time

Modification du modèle

Si vous faites une erreur, veuillez la signaler.

php;task.rb


class Task < ApplicationRecord
  has_one :start_time
  has_one :stop_time
end

php;stop_time.rb


class StopTime < ApplicationRecord
  belongs_to :task
end

php;start_time.rb


class StartTime < ApplicationRecord
  belongs_to :task
end

Fichier de migration

class CreateTasks < ActiveRecord::Migration[6.0]
  def change
    create_table :tasks do |t|
      t.string :title
      t.timestamps
    end
  end
end

php;202..._create_start_times.rb


class CreateStartTimes < ActiveRecord::Migration[6.0]
  def change
    create_table :start_times do |t|
      t.references :task, foreign_key: true
      t.timestamps
    end
  end
end

php;202..._create_stop_times.rb


class CreateStopTimes < ActiveRecord::Migration[6.0]
  def change
    create_table :stop_times do |t|
      t.references :task, foreign_key: true
      t.timestamps
    end
  end
end

Terminal

rails db:create
rails db:migrate

routage

Rails.application.routes.draw do
  root "tasks#index"
  resources :tasks, only: [:index, :create] do
    resources :start_times, only: :create
    resources :stop_times, only: :create
  end 
end

Seuls ceux à utiliser sont spécifiés. De plus, cette fois, il est imbriqué, mais vous pouvez réellement le faire sans.

manette

Terminal

rails g controller tasks
rails g controller start_times
rails g controller stop_times

php;start_times_controller.rb


class StartTimesController < ApplicationController
  def create
    StartTime.create(start_time_params)
    redirect_to root_path
  end

  private
  def start_time_params
    params.permit(:task_id)
  end
end

php;stop_times_controller.rb


class StopTimesController < ApplicationController
  def create
    StopTime.create(stop_time_params)
    redirect_to root_path
  end

  private
  def stop_time_params
    params.permit(:task_id)
  end
end

php;tasks_controller.rb


class TasksController < ApplicationController
  def index
    @tasks = Task.all
  end

  def create
    task = Task.create(task_params)
    redirect_to root_path
  end

  private
  def task_params
    params.permit(:title)
  end
end

Vue

Veuillez vérifier l'url sur les itinéraires ferroviaires et le saisir.

php;views/tasks/index.html.haml


-#Formulaire de sauvegarde des tâches
= form_with url: tasks_path, method: :post do |f|
  = f.text_field :title
  = f.submit "send"

-#Affichage de la liste des tâches
- @tasks.each do |task|
  %br
Titre
  = task.title

  -#Si vous souhaitez vérifier l'heure, veuillez la décrire.
  - if task.start_time != nil
    %br
Heure de début
    = task.start_time.created_at
    %br
  - if task.stop_time != nil
Heure de fin
    = task.stop_time.created_at
    %br
    %br
  -#Jusque là

  - if task.start_time == nil
    = form_with url: task_start_times_path(task_id: task.id), method: :post do |f|
      = f.submit "début"
      %br

  - if task.start_time != nil && task.stop_time == nil 
    = form_with url: task_stop_times_path(task_id: task.id), method: :post do |f|
      = f.submit "Fin"
      %br

Cette fois, je n'ai pas du tout créé new.html.haml. Cependant, dans form_with, vous pouvez spécifier l'url correspondant à l'action de création et ajouter method :: post pour l'enregistrer directement. Si cela ne fonctionne pas, vous devez utiliser binding.pry etc. pour vérifier la valeur que vous envoyez et la valeur que vous recevez.

Résumé

On a l'impression que c'est fait avec la force brute, donc si vous avez un meilleur moyen, veuillez commenter!

Recommended Posts

[Rails] Enregistrer l'heure de début et l'heure de fin
[Rails] Validez l'heure de début (type datetime) et l'heure de fin
Rails et données de forme
Date et l'heure
[Rails] Différence entre la méthode de création et la méthode nouvelle + sauvegarde
Rails valides et invalides?
Implémentation de la fonction Rails CRUD ② (édité et détaillé cette fois)
Changer la date et l'heure en notation japonaise dans Rails
[Rails] Précautions lors de la comparaison de la date et de l'heure avec DateTime
Politique de mise en œuvre pour enregistrer et afficher dynamiquement le fuseau horaire dans les rails
AWS et délai de mise sous tension
[Rails] Enregistrez des images à l'aide de carrierwave
[Rails] Obtenez access_token au moment de l'authentification Twitter avec Sorcery et enregistrez-le dans la base de données
Poteaux Rails et liaison utilisateur
[Rails] nécessitent une méthode et une méthode d'autorisation
Registres du didacticiel Rails et mémorandum n ° 0
chemins de rails et méthodes d'URL
Enregistrer et afficher plusieurs images
Les rails sont difficiles et douloureux!
Les rails sont difficiles et douloureux! Ⅱ
[Rails] strftime ceci et cela
Serveur Web et serveur d'applications Rails
[Rails] Pourquoi est-il rendu si la sauvegarde réussit et que redirect_to échoue?