[RUBY] Implémentez un système de réservation utilisant des Rails et un calendrier simple! Ajoutons la validation à datetime!

Ce que vous souhaitez mettre en œuvre

Utilisez le calendrier simple de Gem pour planifier des réservations dans le calendrier Nous procéderons en partant du principe que vous avez des connaissances de base sur le rubis et les rails

Environnement de développement

Rails 6.0.3 ruby 2.7.0

Ajouter une table de réservations

Cette fois, en supposant que nous allons créer une mini application, nous allons créer une table de réservations et ajouter des colonnes pour le nom (chaîne) et start_time (type datetime).

rails new calendar_app

Tout d'abord, les rails habituels neufs

bundle

Prenons également l'habitude d'installer des bundles.

Gemfile


gem 'simple_calendar', '~> 2.0'
bundle

Ajoutez simple_calendar au gemfile et réinstallez le bundle

rails g scaffold reservationc name start_time:datetime

Cette fois, je voudrais implémenter facilement l'application en utilisant l'échafaudage.

rails db:migrate

N'oubliez pas les rails habituels db: migrate.

スクリーンショット 2020-11-02 23.30.30.png

Accédez à http: // localhost: 3000 / avec des rails s! Si vous pouvez confirmer que vous vous tenez fermement

routes.rb


root 'reservations#index'

Modifions le chemin de l'itinéraire vers la page de liste de réservation. スクリーンショット 2020-11-02 23.33.42.png

Ensuite, nous préparerons la vue de simple_calendar.

rails g simple_calendar:views
create  app/views/simple_calendar
      create  app/views/simple_calendar/_calendar.html.erb
      create  app/views/simple_calendar/_month_calendar.html.erb
      create  app/views/simple_calendar/_week_calendar.html.erb

Trois fichiers ont été créés, mais cette fois, j'aimerais utiliser la bouche.

application.css


 *= require simple_calendar
# simple_Lire le CSS du calendrier

ruby:reservations.index.html.erb



<p id="notice"><%= notice %></p>

<h1>Reservations</h1>

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Start time</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @reservations.each do |reservation| %>
      <tr>
        <td><%= reservation.name %></td>
        <td><%= reservation.start_time %></td>
        <td><%= link_to 'Show', reservation %></td>
        <td><%= link_to 'Edit', edit_reservation_path(reservation) %></td>
        <td><%= link_to 'Destroy', reservation, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<!--d'ici--!>
<%= month_calendar events: @reservations do |date, reservations| %>
  <%= date %>

  <% reservations.each do |reservation| %>
    <div>
      <%= reservation.start_time.hour %>:<%= reservation.start_time.min %>
      <%= reservation.name %>
    </div>
  <% end %>
<% end %>
<!--Ajouter ici--!>

<%= link_to 'New Reservation', new_reservation_path %>

スクリーンショット 2020-11-02 23.49.48.png Je pense que j'ai pu afficher le calendrier!

スクリーンショット 2020-11-02 23.52.22.png

Si vous ajoutez une réservation, elle sera reflétée dans le calendrier ♪

Cela seul est ennuyeux, ajoutons donc la validation.

Faites votre propre validation spéciale

Je souhaite limiter le nombre de réservations cette fois, donc les réservations ne sont pas possibles les samedis et dimanches. Les dates passées ne peuvent pas être sélectionnées Je voudrais faire une formidable validation spéciale que le fuseau horaire de réservation est seulement 13h15 et 19h15!

reservation.rb


class Reservation < ApplicationRecord
  validates :name, presence: true
  validate :date_before_start
  validate :start_time_not_sunday
  validate :start_time_not_saturday
  validate :time_only
  validates :start_time, uniqueness: { message: 'Est réservé par un autre utilisateur' }

  def date_before_start
    errors.add(:start_time, "Impossible de sélectionner une date dans le passé") if start_time < Date.today
  end

  def start_time_not_sunday
    errors.add(:start_time, "Impossible de sélectionner dimanche") if start_time.sunday?
  end

  def start_time_not_saturday
    errors.add(:start_time, "Impossible de sélectionner samedi") if start_time.saturday?
  end
  
  def time_only
    if hour_only_1 && min_only
      true
    elsif hour_only_2 && min_only
      true
    else
      errors.add(:start_time, "(temps)Est 13:15 ou 19:Sera 15 ans")
    end
  end

  def hour_only_19
    start_time.hour == 19
  end

  def hour_only_13
    start_time.hour == 13
  end

  def min_only
    start_time.min == 15
  end
end

date_before_time indique que vous ne pouvez pas sélectionner une date dans le passé. Les samedis et dimanches ne peuvent pas être réservés avec start_time_not_subday et start_time_notsaturday! start_time.sunday? Etc. date_time (type) dimanche? Vraiment? Cela peut être exprimé ainsi!

De là, c'est la production! !! Nous limiterons les réservations à deux heures, 13h15 et 19h15.

Puisque vous pouvez spécifier l'heure avec start_time.hour et le nombre de minutes avec start_time.min Nous limiterons cela à 13h00, 19h00 et 15 minutes!

Créez une méthode time_only pour limiter le temps! !! De plus, en définissant start_time sur uniqqueness: true, les réservations ne peuvent pas être effectuées même en même temps, donc le nombre maximum de réservations pouvant être effectuées par jour est de 2! !!

Édition supplémentaire

Cette fois, c'était une forme très spéciale, donc j'ai fait ma propre validation, mais pour la validation datetime Il existe des gemmes utiles telles que validates_timeliness! https://github.com/adzap/validates_timeliness

# in Gemfile
gem 'validates_timeliness', '~> 5.0.0.beta1'

# Run bundler
$ bundle install

Par exemple, si vous souhaitez limiter le temps de réservation entre 9h00 et 5h00 validates_time :booked_at, between: ['9:00am', '5:00pm'] Vous pouvez facilement l'implémenter en l'écrivant sous une forme comme celle-ci! !!

Recommended Posts

Implémentez un système de réservation utilisant des Rails et un calendrier simple! Ajoutons la validation à datetime!
Comment implémenter une image de profil circulaire avec CarrierWave et R Magick in Rails
[Rails] Un moyen simple d'implémenter une fonction d'auto-introduction dans votre profil
[Rails] Ajoutez un écran de confirmation et un écran de fin pour concevoir l'inscription des membres.
J'ai essayé de créer une application simple en utilisant Dockder + Rails Scaffold
[Rails] Introduisez un calendrier simple et insérez un "écran de confirmation" dans les événements supplémentaires
Comment mettre en œuvre un diaporama en utilisant Slick in Rails (un par un et plusieurs par un)
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
[Rails] [Note] Quand ajouter = à <%%> et quand pas
Pour implémenter la publication d'images à l'aide de rails
Un mémo pour créer un formulaire simple en utilisant uniquement HTML et CSS dans Rails 6
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Ajoutez une fonction de balise aux rails. Utilisez actes-comme-taggable-on
Comment implémenter une fonctionnalité similaire dans Rails
J'ai essayé d'implémenter un serveur en utilisant Netty
Implémentation de calendrier simple de Rails Gem et branchement conditionnel
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
[Rails] Créez un plan de site à l'aide de sitemap_generator et déployez-le dans GAE
Créons un système de téléchargement de fichiers à l'aide de l'API Azure Computer Vision et du SDK Java d'Azure Storage