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