[RUBY] Rails Learning Jour 3 Partie 2

Ruby on Rails 5 Guide pratique d'apprentissage rapide chapitre 7

7-1 Insérez un écran de confirmation avant d'enregistrer ou de modifier

Avant de vous enregistrer, un écran de confirmation apparaîtra, et après confirmation, définissez les données à enregistrer. Tout d'abord, écrivez l'action (conform_new action) qui affiche l'écran de confirmation sur le contrôleur.

app/controller/tasks_controller.rb


 def confirm_new
   @task = current_user.tasks.new(task_params)
   render :new unless @task.valid? #Si dans la base de données@Exécuter s'il n'y a pas de tâche

Remplissez ensuite le routage

config/routes.rb


resources :tasks do
  post :confirm, action: :confirm_new, on: :new
end

post :confirm, action: :confirm_new, on: :new Cette pièce avait à l'origine la forme suivante

config/routes.rb


resources :tasks do
  new do
   post :confirm, action: :confirm_new
  end
end

S'il n'y a qu'un seul élément dans le nouveau bloc, il sera routé en utilisant on :: block name après lui.

Ensuite, créez une vue d'écran de confirmation

slim:app/views/tasks/confirm_new.html.slim


h1 Confirmation de nouveaux contenus

= form_with model: @task, local: true do |f|
  table.table.table-hover
    tbody
      tr
        th= Task.human_attribute_name(:name)
        td= @task.name
        =f.hidden_field :description
      tr
        th= Task.human_attribute_name(:description)
        td= simple_format(@task.description)
        =f.hidden_field :description
  =f.submit 'Revenir', name: 'back', class: 'btn btn-secondary mr-3'
  =f.submit 'enregistrement', class: 'btn btn-primary'

7-1-3 Correspond à la transition depuis le bouton "Retour" dans l'action d'enregistrement.

La vue de l'écran de confirmation ci-dessus comporte deux boutons, un bouton de retour et un bouton d'enregistrement. Si vous voulez que le bouton de retour fonctionne, vous devez déterminer lequel de ces deux boutons est enfoncé. Par conséquent, back est ajouté à l'attribut name du bouton Précédent. En termes de programmation, si l'attribut de nom est enfoncé, il reviendra à l'opération d'origine. En d'autres termes, le résultat de params [: back] doit être obtenu. Écrivez simplement dans l'action de création l'action de revenir à l'original lorsque vous appuyez sur les paramètres [: back].

app/controllers/tasks_controller.rb


def create
  @task = current_user.tasks.new(task_params)

  if params[:back].present? #present?Est une valeur booléenne qui est vraie s'il y a une valeur
    render :new
    return
  end

Types de méthodes utilisées pour les valeurs booléennes

Nom de la méthode Signification de la méthode
nil? Vrai si la valeur de la variable est nulle ou sans valeur
empty? La valeur de la variable est""Vrai si (pour les chaînes) ou si la valeur est vide. néant?La différence avec est vide?Peut avoir une valeur variable, mais cette valeur indique vide
blank? Vrai s'il n'y a pas de valeur
present? Vrai s'il y a une valeur

7-2 Ajouter une fonction de recherche à l'écran de liste

À mesure que le nombre de tâches dans la liste de tâches augmente, il devient difficile de les trouver une par une. Il serait pratique d'avoir une fonction de recherche à de tels moments. Utilisez une gemme appelée Ransack pour ajouter une fonction de recherche

7-2-2 Recherche par nom Ajouter une fonctionnalité de recherche avec Ransack

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true).recent
end

@q = current_user.task.ransack(params[:q])

Dans ransack, recherchez en prenant le paramètre de requête (params [: q]) Recherchez la tâche de l'utilisateur connecté avec ransack et mettez-la sous la forme @q

@task = @q.result(distinct: true).recent

@Q qui est sorti dans la recherche À l'exclusion des résultats de recherche en double (résultat (distinct: vrai)) Affichage par ordre de date et d'heure d'enregistrement (récent)

Maintenant que nous avons implémenté le ransack, cherchons réellement dans la vue. Utilisez search_form_for pour ajouter une fonctionnalité de recherche

slim:app/views/tasks/index.html.slim


liste des tâches h1

= search_form_for @q, class: 'mr-5' do |f|
  .form_group.row
    =f.label :name_cont, 'Nom', class: 'col-sm-2 col-form-label'
    .col-sm-10
      =f.search_field :name_cont, class: 'form-control'
  .form-group.row
    =f.label :created_at_gteq, 'Date d'enregistrement', class: 'col-sm-2 col-form-label'
    .col-sm-10
      = f.search_field :created_at_gteq, class: 'form-control'
  .form-group
    =f.submit class: 'btn btn-outline-primary'

= link_to 's'inscrire', new_task_path, class:  'btn btn-primary mb-3'

name_cont: Sélectionnez celui qui correspond partiellement au nom. .search_field: où remplir created_at_gteq: sélectionnez un article plus grand que la date et l'heure de publication que vous avez entrées (future: gteq)

7-3 Ajouter une fonction de tri à l'écran de liste

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true).recent
end

J'avais l'habitude de trier par récent, mais ensuite je vais trier dans n'importe quel ordre D'abord prendre du ressentiment

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true)
end

ruby:app/views/tasks/index.html.slim


table.table.table-hover
  thead.thead-default
    tr
      th= sort_link(@q, :name, default_order: :desc)
      th= Task.human_attribute_name(:created_at)
      th

Si vous ajoutez sort_link, vous pourrez effectuer des opérations de tri. Le premier argument est la valeur obtenue par ransack (ici @q) Le deuxième argument est la colonne à trier (nom dans ce cas) default_order: :desc

7-4 Envoyer un e-mail

Rails utilise un mécanisme appelé mailer pour envoyer des e-mails. Composez et envoyez des e-mails à l'aide de Mailer. Mailer décrit dans le fichier mailer

app/mailers/task_mailer.rd


class TaskMailer < ApplicationMailer
  def creation_email(task)
    @task = task
    mail(
      subject: 'E-mail de fin de création de la tâche'
      to: 'user@example'
      from: 'taskleaf@example'
     )
  end
end

Définir le courrier d'informations telles que l'objet, à, à partir de la méthode creation_email

7-4-3 Processus de transmission des e-mails

Rendre possible d'envoyer des e-mails

app/controllers/tasks_controller.rb


def create
  @task = current_user.tasks.new(task_params)

  if params[:back].present?
    render :new
    return
  end

  if @task.save
    TaskMailer.creation_email(@task).deliver_now
    redirect_to @task, notice: "tâche"#{@task.name}Était inscrit"
  else
    render :new
  end
end

Si vous ajoutez TaskMailer.creation_email (@task) .deliver_now comme ci-dessus, un e-mail à propos de @task sera envoyé. délivrer_now est une méthode de transmission immédiate. Il existe également une méthode livrer_later

7-5 Téléchargez le fichier et joignez-le au modèle

Un joyau de gestion de fichiers appelé Active Storage sort et les utilise pour joindre des photos et des images Pour l'attacher, attachez-le par la méthode suivante

app/models/task.rb


class Task < ApplicationRecord
  has_one_attached :image
....

end

En utilisant la méthode has_one_attached, il est possible d'associer une image à une tâche.

ruby:app/views/tasks/_form.html.slim


...
...
...
.form-group
  =f.label :image
  =f.file_field :image, class: 'form-control'
...
end

Définissez également "image: image" dans ja.yml Autoriser à la fois l'autorisation et l'image de la méthode task_params

Écrivez le code pour qu'il apparaisse également sur l'écran de confirmation

ruby:app/views/tasks/show.html.slim


...
tr
  th= Task.human_attribute_name(:image)
  td= image_tag @task.image if @task.image.attached?
tr
...
...
...

if @ task.image.attached? Indique si l'image est jointe. S'il y a une image réelle, affichez-la avec image_tag

Nation de 7 à 7 pages

Plus il y a de tâches, plus la méthode d'affichage de toutes les informations qui a été effectuée jusqu'à présent est lourde. La pagination est une méthode pour alléger l'opération en distribuant des informations en fonction de la page, comme en passant l'affichage à la page suivante lorsque le nombre de fichiers dépasse un certain nombre. Un fichier gem appelé kaminari est utilisé pour cette pagination.

Fichier original tasks_controller

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true)
end

En ajoutant .page (params [: page]) à la fin, vous pouvez déterminer le nombre d'éléments à afficher par page (25 éléments par page par défaut).

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true).page(params[:page])
end

Ensuite, rendez-le réellement reflété dans le fichier de vue

ruby:app/views/tasks/index.html.slim


.mb-3
  =paginate @tasks
  =page_entries_info @tasks
...
...
...

Il est créé automatiquement à l'aide de la méthode d'assistance paginate et de la méthode d'assistance page_entries_info.

7-8 Effectuer un traitement asynchrone et une exécution périodique (planification des travaux)

Rails fournit un cadre appelé Active Job pour effectuer divers processus de manière asynchrone en arrière-plan. ActiveJob est utilisé lorsque:

・ Le traitement est lourd et fait attendre l'utilisateur. ・ Je veux que vous agissiez à la date et à l'heure spécifiées

Le mécanisme appelé sidekiq est utilisé dans un tel cas.

① Tout d'abord, synchronisez Rails et Sideskiq

config/environments/development.rb


config.active_job.queue_adapter = :sideskiq

② Créez app / jobs / sample_job.rb et créez une méthode perform

app/jobs/sample_job.rb


class SampleJob < ApplicationJob
  queue_as :deault

  def perform(*args)
    Sidekiq::Logging.logger.info "J'ai exécuté un exemple de travail"
  end
end

Appelez la méthode perform à traiter

app/controller/tasks_controller.rb


def create
  @task = current_user.tasks.new(task_params)
  ...
  if @task.save
    TaskMailer.created_email(@task).deliver_now
    SampleJob.perform_later
...
...
...

SampleJob.perform_later effectue désormais un traitement asynchrone

7-8-3 Spécifier la date et l'heure d'exécution

Si vous utilisez la méthode set, vous pouvez spécifier la date et l'heure d'exécution du processus.

#Courir à midi le lendemain
SampleJob.set(wait_until: Date.tomorrow.noon).perform_later

#Courir après une semaine
SampleJob.set(wait: 1.week).perform_later

Recommended Posts

Rails Learning Jour 3 Partie 2
Rails Learning Jour 1 Partie 2
Rails Learning jour 4
Rails Learning jour 2
rails d'apprentissage jour 1
Programmation apprentissage jour 3
Rails Docker-Partie 1-
Rails Docker ~ Partie 2 ~
java learning day 2
java learning day 1
Tutoriel Rails Chapitre 3 Apprentissage
[Rails] Didacticiel Apprendre avec les rails
Tutoriel Rails Chapitre 4 Apprentissage
Tutoriel Rails Chapitre 1 Apprentissage
Tutoriel Rails Chapitre 2 Apprentissage
Record d'apprentissage Ruby on rails -2020.10.04
Record d'apprentissage de Ruby on rails -2020.10.05
java learning day 4
Record d'apprentissage Ruby on rails-2020.10.07 ②
Record d'apprentissage Ruby on rails-2020.10.07 ①
Record d'apprentissage de Ruby on rails -2020.10.06
Rails 5 Lecture de code Partie 2 ~ Vue Action ~
Tutoriel Rails 6e édition Résumé d'apprentissage Chapitre 10
Rails Tutorial 6e édition Résumé de l'apprentissage Chapitre 7
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 4
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 9
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 6
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 5
Rails Tutorial 6e édition Résumé de l'apprentissage Chapitre 2
Tutoriel Rails Chapitre 0: Apprentissage préliminaire des connaissances de base 5
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 3
Muscle Ruby on Rails Jour 1 ~ Construction de l'environnement ~
Rails Tutorial 6e édition Résumé d'apprentissage Chapitre 8