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'
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 |
À 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)
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
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
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
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
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.
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
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