[RUBY] Rails Learning jour 2

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

4-2-1 Type de données

Chaque colonne de la base de données a besoin d'un type de données. Un type de données spécifie les valeurs qu'il contient avec des conditions spécifiques.

Type de données Explication
:boolean Valeur booléenne
:integer Entier signé
:float Nombre à virgule flottante
:string Chaîne de caractères (courte)
:text Chaîne de caractères (longue)
:date Date
:datetime Date et l'heure

Distinguer les données à l'intérieur en ajoutant le type de données ci-dessus à chaque colonne

4-2-2 Contrainte NOT NULL

Si la colonne n'a pas de valeur, la valeur est définie comme NULL et enregistrée en tant que table, mais en utilisant NOT NULL, il est possible de spécifier que la colonne contient toujours une valeur.

・ Comment appliquer la contrainte NOT NULL Il existe deux façons d'appliquer la contrainte NOT NULL. La première consiste à mettre des restrictions lors de la création d'une table. La deuxième méthode consiste à ajouter une contrainte lorsque vous souhaitez ajouter une contrainte après la création de la table.

  1. Comment mettre des contraintes lors de la création d'une table Comment créer une table par db: migrer après avoir appliqué la contrainte NOT NULL au fichier de migration pour créer la table telle quelle

db/migrate/XXXXXXXXXX_create_tasks.rb


class CreateTasks < ActionRecord::Migration[5.2]
 def change
  create_table :tasks do |t|
   t.string :name, null: false
   t.text :description
...

Puisqu'il y a un problème s'il n'y a pas de valeur dans la partie nom, ajoutez null après le nom. Après cela, ajoutez true si null (vide) est acceptable et false si vide n'est pas aimé (NOT NULL).

  1. Comment ajouter des contraintes lorsque vous souhaitez ajouter des contraintes après avoir créé une table
$ bin/rails g migration ChangeTaskNameNotNull

La table étant déjà créée, il est inutile de modifier le fichier de migration. Créez donc un fichier de migration pour les modifications et écrivez le code pour les modifications ici

db/migrate/XXXXXXXXXXXX_change_tasks_name_not_null.rb


class ChangeTaskNameNotNull < ActionRecord::Migration[5.2]
 def change
  change_column_null :tasks, :name, false
 end
end

Modifiez la tâche à l'aide de change_column_null (remplacez la colonne par null) dans le fichier de migration créé pour modification. change_column_null: nom de la tâche ,: nom de la colonne ,: vrai ou faux (vrai est nul, faux n'est pas nul),

Spécifiez la longueur de la colonne de chaîne de caractères (méthode de changement et méthode de montée et de descente)

Pour spécifier la longueur de la chaîne de caractères, ajoutez des informations au fichier de migration pour créer la table ou créez un fichier de migration pour ajouter des informations à la table pour laquelle les informations ont été décidées, comme expliqué ci-dessus. Est. Cette fois, voyons comment créer un fichier de migration pour ajouter des informations à une table dont les informations ont été décidées.

class ChangeTasksNameLimit30 < ActionRecord::Migration[5.2]
 def up
  change_column :tasks, :name, :string, :limit: 30
 end
 def down
  change_column :tasks, name, :string
 end
end

Cette fois, faites attention à l'endroit où la méthode up et la méthode down sont écrites au lieu de la méthode change. À l'origine, la méthode de changement est une méthode créée en combinant la méthode up et down méthode ci-dessus. La raison pour laquelle la méthode de changement est divisée en deux cette fois est dans [change_column]. Si vous utilisez change_column dans la méthode de modification, vous ne pouvez pas l'annuler en cas de problème. Lors du retour de la version, tout en regardant la version mise à jour (up ou change), effectuez l'opération inverse pour retourner la version. Mais cela ne fonctionne pas avec la méthode de changement.

4-2-4 Créer un index unique

L'index unique est également écrit dans le fichier de migration pour créer la table ou le fichier de migration pour l'ajout et la modification comme décrit ci-dessus.

class AddNameIndexToTasks < ActiveRecord::Migration[5.2]
 def change
  add_index :task, :name, unique: true
 end
end

L'ajout d'un index unique élimine la duplication des valeurs (nom dans ce cas) (pas de couverture)

4-3-6 Écrivez le code de vérification original (créez vous-même les validations)

app/models/task.rb


validate :validate_name_not_including_comma

Tout d'abord, mettez le nom du validate que vous avez créé dans validate.

app/models/tasks.rb


private

def validate_name_not_including_comma
  errors.add(:name,'Ne peut pas contenir de virgules') if name&.include?(',')
end

Définissez le contenu de validate que vous avez créé dans une méthode privée (car il est inutile s'il est falsifié de l'extérieur). if name & .include? (',') S'il y a un nom avec une virgule, il sera exécuté normalement, mais s'il s'agit d'un nom sans virgule, le résultat sera nul et une erreur se produira. S'il s'agit d'un opérateur bocchi, nil apparaîtra et seul le mot nil apparaîtra sans erreur.

Séance de 4-5-1

En ayant une session, vous pouvez conserver l'état que vous utilisez un nombre illimité de fois sur n'importe quelle page (connectez-vous)

session[user_id] = @user.id

@user.id = session[user_id]

Ce qui précède est l'opération pour mettre des informations dans la session. Vous trouverez ci-dessous l'opération pour récupérer la valeur de session.

4-5-2 Créer un modèle utilisateur (mot de passe-résumé)

Avec password-digest, votre mot de passe est crypté et vous n'avez pas à vous soucier de la fuite de mot de passe ou de l'accès non autorisé. Pour rendre compatible le mot de passe-digest, vous pouvez l'utiliser en écrivant le code has_secure_password.

app/models/user.rb


class User < ApplicationRecord
  has_secure_password
end

Écrivez has_secure_password dans le modèle. Ensuite, il y aura une colonne appelée password_confimation sous la colonne password. C'est celui qui vous permet de le saisir deux fois pour confirmer votre mot de passe. Il est jugé si ces deux mots de passe correspondent lorsqu'ils sont chiffrés avec mot de passe-digest.

4-5-8 Facilitez l'obtention des informations de connexion

User.find_by(id:session[user_id])

Le code sert à trouver l'identifiant avec lequel vous êtes actuellement en session, donc si vous êtes connecté, vous pouvez identifier l'utilisateur connecté avec ce code. Si vous définissez cela comme une méthode dans ApplicationController, User.find_by (id: session [user_id]) fonctionnera dans n'importe quelle action et vous obtiendrez des informations indiquant que vous êtes connecté. Alors créez une nouvelle méthode

app/controllers/application_controller.rb


class ApplicationController < ActionController::Base
  helper_method :current_user

 private

 def current_user
   @current_user||=User.find_by(id:session[user_id]) if session[:user_id]
 end
end

"Si @current_user fonctionne, @current_user, sinon, si user_id est en session, recherchez les informations de l'utilisateur qui est en session et définissez-les comme variable @current_user" Est définie comme la méthode current_user. Cette méthode ne doit pas être manipulée de l'extérieur, alors mettez-la dans la méthode privée

4-5-9 Mettre en œuvre la fonction de déconnexion

L'état de connexion est reset_session pour se déconnecter.

app/controllers/session_controller.rb


 def destroy
   reset_session
   redirect_to root_url, notice: 'déconnecté'
end

Donc reset_session est défini dans le contrôleur de destruction.

4-5-11-1 Associer l'utilisateur et la tâche sur la base de données

La relation importante entre l'utilisateur et la tâche est [un-à-plusieurs]. C'est une situation où il y a plusieurs tâches pour un utilisateur. L'association spécifique sera décrite.

  1. Tout d'abord, la colonne utilisateur des informations utilisateur de la tâche doit être à l'état NOT NULL.

db/migrate/XXXXXXXXXX_AddUserIdToTasks.rb


class AddUserIdToTasks < ActiveRecord::Migration[5.2]
 def up
   execute 'DELETE FROM tasks;'
   add_reference :tasks, user, null: false, index: true
 end

 def down
   remove_reference :tasks, :user, index: true
 end
end

remove_reference: utilisez une référence lorsque vous souhaitez ajouter des contraintes dans une colonne. remove_reference: tasks ,: user, index: true ← Supprimer ces données add_reference: tâches, utilisateur, null: false, index: true ← Ajout d'une contrainte pour que l'utilisateur devienne nul: false. execute'DELETE FROM tâches; '← Il peut y avoir des données où l'utilisateur était nul: faux avant l'application de la contrainte, et s'il y en a une, une erreur se produira. J'ai donc utilisé ce code pour supprimer toutes les données du tableau.

2.1 Construisez des relations à l'aide de has_many: tasks et appartient_to, qui représentent des relations un à plusieurs.

app/models/user.rb


 has_many :tasks
end

app/models/task.rb


 belongs_to :user
end

La relation entre les bases de données est établie par le modèle, alors remplissez le modèle. user has many tasks tasks belongs to user Parce que ce sera une relation de Has_many: tâches dans le modèle utilisateur le modèle de tâches appartient_à: utilisateur Ajouter.

4-5-11-3 Enregistrement des données de tâche de l'utilisateur connecté

L'action de création pour vous connecter est la suivante

app/controller/tasks_controller.rb


 def create
   @task = Task.new(task_params)
・
・
・
・
・
 private

 def task_params
   params.require(:task).permit(:name, :descrition)
 end
end

À ce rythme, @task créera une nouvelle tâche, mais vous ne saurez pas que c'est la tâche de l'utilisateur connecté. Alors réécrivez le code ci-dessus

app/controller/tasks_controller.rb


 def create
   @task = current_user.task.new(task_params)
・
・
・
・
・
 private

 def task_params
   params.require(:task).permit(:name, :descrition)
 end
end

En ajoutant current_user, cela devient une tâche qui signifie "actuellement connecté". En d'autres termes, si vous ajoutez current_user au début, cela signifie "connecté". Par exemple Task.find (params [: id]) → Récupérer la tâche avec l'id spécifié current_user.tasks.find (params [: id]) → Récupérer la tâche spécifiée dans les tâches de la personne connectée.

Utiliser la portée 4-8

order (created_at :: desc) etc. peut être renommé en un nom plus simple en utilisant scope.

scope :recent, -> {order(created_at: :desc)}

Avec ce code, la commande (created_at :: desc) peut être réécrite comme récente.

D'autres choses que j'ai apprises

task.errors.full_messages

Les informations d'erreur de tâche s'affichent

task.persisted?

Vous pouvez vérifier si la tâche a été enregistrée dans la base de données.

if task.errors.present?
  ul#errors_explanation
   -task.errors.hull_messages.each do |message|
      li= message

Utilisez errors.present? Pour déterminer s'il y a des erreurs.

if user&.authenticate(session_params[:password])

private
 def session_params
   params.require(:session).permit(:email, :password)
 end

Initialement user (session_params [: password]), mais lorsqu'il est chiffré avec password-digest Devenez utilisateur & .authenticate (session_params [: mot de passe]).

if current_user.admin?

Vous pouvez vérifier si vous disposez des droits de gestion des utilisateurs avec l'administrateur. Le current_user est ajouté à cela, et il devient une instruction if qui dit "La personne connectée a-t-elle l'autorité administrative pour cet utilisateur?"

@task = current_user.task.order(created_at: :desc)

order est une opération pour trier la liste selon les critères spécifiés Cette fois, l'ordre d'arrangement basé sur created_at (date et heure de création) a changé.

Recommended Posts

Rails Learning jour 3
Rails Learning jour 4
Rails Learning jour 2
rails d'apprentissage jour 1
Rails apprentissage 2ème jour 2
Rails Learning Jour 1 Partie 3
Rails Learning Jour 3 Partie 2
Rails Learning Jour 1 Partie 2
Programmation apprentissage jour 3
Jour d'apprentissage Java 5
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 de Ruby on rails -2020.10.03
Record d'apprentissage Ruby on rails -2020.10.04
Record d'apprentissage de Ruby on rails -2020.10.05
Record d'apprentissage de Ruby on rails -2020.10.09
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 g. Erreur]
Tutoriel Rails 6e édition Résumé d'apprentissage Chapitre 10
Apprendre Java (0)
Ruby apprentissage 4
Rails Tutorial 6e édition Résumé de l'apprentissage Chapitre 7
Rails Examen 1
API Rails
Migration des rails
Ruby apprentissage 5
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 4
[Rails] first_or_initialize
Journée Java 2018
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 9
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 6
À propos des rails 6
Apprentissage des servlets
Ruby apprentissage 3
Fondation Rails
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 5
Mémorandum Rails
tutoriel sur les rails
rails tutry
tutoriel sur les rails
Sortie d'apprentissage ~ 11/3 ~
Rails Tutorial 6e édition Résumé de l'apprentissage Chapitre 2
Tutoriel Rails Chapitre 0: Apprentissage préliminaire des connaissances de base 5
Ruby apprentissage 2
Apprentissage Maven
[Rails] concevoir
Ruby apprentissage 6
rails tutry
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 3
tutoriel sur les rails
Sortie d'apprentissage
Conseils de rails