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
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.
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).
$ 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),
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.
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)
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.
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.
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.
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
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.
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.
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.
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.
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.
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