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.

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.
Terminal
rails new  _6.0.0_nom de l'application-d mysql
nom de l'application cd
bundle install
rails g model task
rails g model start_time
rails g model stop_time
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
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
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.
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
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.
On a l'impression que c'est fait avec la force brute, donc si vous avez un meilleur moyen, veuillez commenter!
Recommended Posts