J'ai résumé le flux jusqu'à l'implémentation de simple_calendar dans Ruby on Rails.

Je voulais implémenter une fonction de réglage de l'heure de réservation à l'aide d'un calendrier dans l'application d'origine et résumer le flux.

ruby '2.6.5' rails '6.0.0' simple_calendar "~> 2.0"

«En tant que condition préalable, différents appareils sont créés pour l'utilisateur et le médecin. '' Vous trouverez ci-dessous l'URL associée. Paramètres de routage à partir de la création de fichiers lors de la création de plusieurs appareils et de la création d'écrans de connexion séparés [Je veux changer le chemin après une nouvelle inscription après m'être connecté avec plusieurs appareils. ] (https://qiita.com/kinpin/items/57b1657f9054189956c3)

** Que veux-tu faire ** Image from Gyazo

Créez une fonction qui permet à l'utilisateur et au médecin (appareil différent) d'exécuter une telle fonction de calendrier.

Créer une réservation, modifier l'heure de réservation, supprimer → Fonction que le médecin peut faire

Faire une réservation → Fonction que l'utilisateur peut faire

① Écrivez ce qui suit dans le Gemfile et l'installation du bundle.

   gem "simple_calendar", "~> 2.0"

② Les rails seront redémarrés.

③ Créez un modèle. Puisqu'il s'agit d'une fonction de réservation, nous allons créer un modèle de réservation.

  % rails g model reservation

④ Créez un fichier de migration.

   class CreateReservations < ActiveRecord::Migration[6.0]
  def change
    create_table :reservations do |t|
      t.references :doctor,   foreign_key:true 
      t.references :user,    foreign_key:true  
      t.datetime :start_time
      t.datetime :end_time
      t.timestamps
    end
  end
end

⑤ Créez une association dans le fichier modèle. Je l'écris également dans le modèle de médecin du modèle utilisateur (omis)

   class Reservation < ApplicationRecord
     belongs_to :doctor
     belongs_to :user, optional: true
     validates :start_time, presence: true
     validates :end_time, presence: true
   end

optionnel: true est décrit car il autorise nil de la clé externe. C'est parce qu'il n'y a pas de user_id lors de la création d'une nouvelle réservation. La réservation est créée par le médecin, il y a donc toujours un doctor_id.

Exécutez les rails db; migrez.

   % rails db:migrate

⑥ Ensuite, vous avez besoin d'un contrôleur, mais il y a quelques mises en garde.

Les fonctions que l'utilisateur peut effectuer et les fonctions que le médecin peut effectuer sont différentes, et il est étrange que l'utilisateur et le médecin passent par le même contrôleur en raison de problèmes de sécurité. Créez donc des contrôleurs sous différents répertoires.

   % rails g controller doctors/reservations
   % rails g controller users/reservations

⑦ En faisant cela, le contrôleur par lequel l'utilisateur passe et le contrôleur par lequel passe le médecin peuvent être séparés.

doctorreservation.png

user.reservation.png

⑧ Définissez le routage. Nous utilisons l'espace de noms parce que nous voulons utiliser le chemin spécifié pour chaque appareil.

   namespace :doctors do
      resources :reservations 
    end
  
    namespace :users do
      resources :reservations 
    end

Si vous effectuez des itinéraires de rails, vous pouvez voir que chaque itinéraire a été créé.

                            DELETE /users/:id(.:format)                                                                     users#destroy
                 doctors_reservations GET    /doctors/reservations(.:format)                                                          doctors/reservations#index
                                      POST   /doctors/reservations(.:format)                                                          doctors/reservations#create
              new_doctors_reservation GET    /doctors/reservations/new(.:format)                                                      doctors/reservations#new
             edit_doctors_reservation GET    /doctors/reservations/:id/edit(.:format)                                                 doctors/reservations#edit
                  doctors_reservation GET    /doctors/reservations/:id(.:format)                                                      doctors/reservations#show
                                      PATCH  /doctors/reservations/:id(.:format)                                                      doctors/reservations#update
                                      PUT    /doctors/reservations/:id(.:format)                                                      doctors/reservations#update
                                      DELETE /doctors/reservations/:id(.:format)                                                      doctors/reservations#destroy
                   users_reservations GET    /users/reservations(.:format)                                                            users/reservations#index
                                      POST   /users/reservations(.:format)                                                            users/reservations#create
                new_users_reservation GET    /users/reservations/new(.:format)                                                        users/reservations#new
               edit_users_reservation GET    /users/reservations/:id/edit(.:format)                                                   users/reservations#edit
                    users_reservation GET    /users/reservations/:id(.:format)                                                        users/reservations#show
                                      PATCH  /users/reservations/:id(.:format)                                                        users/reservations#update
                                      PUT    /users/reservations/:id(.:format)                                                        users/reservations#update
                                      DELETE /users/reservations/:id(.:format)                                                        users/reservations#destroy

⑨ Créez la vue souhaitée.

Il est affiché sur l'écran du médecin. Le médecin crée un lien qui passe au nouvel écran de réservation, à l'écran d'édition et à l'écran de suppression sur l'écran du salon du médecin, et l'utilisateur crée un lien qui passe à l'écran de réservation sur l'écran du salon du médecin.

Tout d'abord, insérez le calendrier.

     
   <%= month_calendar do |date| %>
     <%= date.day %>
   <% end %>

Ceci termine la création du modèle de calendrier.

⑩ Définissez les méthodes de création, de modification et de suppression de réservation dans le contrôleur de médecin et prenez des décisions de réservation dans le contrôleur d'utilisateur.

`Ici, quelle méthode est utilisée pour déterminer la réservation de l'utilisateur, mais la conclusion est modifier. '' Comme la table de réservation contient des données au moment de la liste de réservation, l'ajout de user_id est considéré comme ajoutant l'un des enregistrements.

doctors/reservations_controller.rb



 def new
    @reservation = Reservation.new
  end

  def create
    @reservation = Reservation.new(reservation_params)
    if @reservation.save
      redirect_to doctor_path(current_doctor.id)
    else
      render :new
    end
  end

  def edit
    @reservation = Reservation.find(params[:id])
  end

  def update
    @reservation = Reservation.find(params[:id])
    if @reservation.update(reservation_params)
      redirect_to doctor_path(current_doctor.id)
    else
      render :edit
    end
  end

  def destroy
    @reservation = Reservation.find(params[:id])
    if @reservation.destroy
      redirect_to doctor_path(current_doctor.id)
      else
      render :show
    end
  end

  private

  def reservation_params
    params.require(:reservation).permit(:start_time, :end_time).merge(doctor_id: current_doctor.id)
  end
end

users/reservations_controller.rb



def edit
    @reservation = Reservation.find(params[:id])
    @doctor = Doctor.find(params[:id])
  end

  def update
    @reservation = Reservation.find(params[:id])
    if @reservation.update(user_id: current_user.id)
      redirect_to doctor_path(@reservation.doctor_id)
    else
      render :edit
    end
  end

L'affichage de la vue doit encore être affiné, mais cela vous permet de définir la fonction de réservation de calendrier minimum. Je vais l'ajouter à nouveau. C'est ainsi que nous avons introduit simple_calendar. Si vous avez des suggestions, faites-le nous savoir! !!

Recommended Posts

J'ai résumé le flux jusqu'à l'implémentation de simple_calendar dans Ruby on Rails.
[Ruby on Rails] Jusqu'à l'introduction de RSpec
Rails nouveau dans Ruby on Rails ~ Mémorandum jusqu'au déploiement 2
Rails nouveau dans Ruby on Rails ~ Mémorandum jusqu'au déploiement 1
[Ruby on Rails] Afficher rapidement le titre de la page dans le navigateur
Débutant Ruby on Rails Ce que j'ai appris est résumé
Ruby on Rails compatible japonais-anglais i18n
[Ruby on Rails] Arrêtez de "boucler jusqu'à ce que ..."
Où j'étais intéressé par le cours Ruby on Rails de Progate [params]
Points à retenir et concepts dans le didacticiel Ruby on Rails
Ruby on Rails dans les espaces de codes Visual Studio
Débutant a créé un portfolio avec Ruby on Rails
Comment déboguer le traitement dans le modèle Ruby on Rails avec juste la console
Cloud IDE: Heroku n'a pas pu être installé dans le didacticiel Ruby on Rails
Une série de flux de création de table → création, suppression d'enregistrement → suppression de table dans Ruby on Rails
J'ai essayé d'organiser la session en Rails
Quand le terminal Ruby on Rails revient en arrière
Recommandation de classe de service dans Ruby on Rails
Publiez l'application avec ruby on rails
(Ruby on Rails6) Création de données dans une table
Je veux obtenir la valeur en Ruby
J'ai fait un portfolio avec Ruby On Rails
Comment résoudre les erreurs qui se produisent lors du test d'intégration "Ruby on Rails"
[Ruby on Rails] Comment écrire enum en japonais
[Ruby On Rails] Dans l'état imbriqué, la description entre parenthèses écrite après Prefix dans la méthode link_to
[Ruby on Rails] Comment changer le nom de la colonne
[Ruby] puma ne peut pas être installé sur Mac [Rails, etc.]
J'ai résumé le format d'affichage de la réponse JSON de Rails
[Ruby On Rails] Comment réinitialiser DB dans Heroku
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
[Ruby on Rails] Fonction de prévisualisation de l'image dans le fichier
Questions sur l'implémentation de la fonctionnalité Like (Ajax) dans Rails
Association Ruby On Rails
(Ruby on Rails6) Refléter le contenu publié à partir du formulaire
Essayez d'utiliser l'attribut de requête Ruby on Rails
Ce qui m'intéressait dans le cours Ruby on Rails de Progate [chaque énoncé de message d'erreur]
Ruby on Rails 5 guide pratique d'apprentissage rapide qui peut être utilisé sur le terrain Résumé
[Ruby on Rails] Seul l'utilisateur qui a publié peut modifier
J'ai essayé d'installer le plugin lié à Ruby on Rails avec vim-plug
Difficultés à créer un environnement Ruby on Rails (Windows 10) (SQLite3)
(Ruby on Rails6) Affichage de la base de données qui a obtenu l'identifiant de la base de données
Supprimer tout le contenu de la page de liste [Ruby on Rails]
Une note sur la fonction de départ de Ruby on Rails
[Ruby on Rails] Saisissez automatiquement une adresse à partir d'un code postal
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)