[RUBY] [Rails] Enregistrez-vous par attribut du même modèle en utilisant Devise

introduction

Lorsque je m'inscris en tant qu'utilisateur utilisant Devise in Rails, je pense qu'il y a des moments où je veux diviser les attributs par des paramètres tout en utilisant le même modèle, mais étonnamment, il n'y a pas d'article qui dit cela, donc je vais l'écrire comme un article. Il est supposé qu'il existe un lien d'enregistrement pour d'autres attributs en plus des nouveaux liens d'enregistrement et de connexion (voir ici pour l'enregistrement des membres premium). Nous voulons diviser cela en attributs en donnant des paramètres tels que Boolean tout en réutilisant la vue et le contrôleur avec un modèle utilisateur. Je vous serais reconnaissant de bien vouloir signaler toute erreur.

environnement

console


Windows10
ruby 2.6.6
Rails 6.0.3.1
psql (PostgreSQL) 12.3

Ajouter une colonne

Tout d'abord, ajoutez une colonne pour attribuer le modèle User existant (cette fois, il s'agit de isPremium: boolean). L'ajout de cette colonne est également assez mystérieux pour les débutants, et au début je n'étais pas sûr et j'ai essayé de l'ajouter au fichier de migration existant, mais apparemment, le fichier de migration utilisé lors du premier rails db: migrate a été lu par la suite. Absent? Il semble. Créez donc un autre fichier de migration et écrivez une méthode pour y ajouter des colonnes.

console


rails g migration AddCulumnToTable

La partie de AddCulmnToTable est un nom de classe arbitraire, mais il semble généralement que quelque chose de facile à comprendre plus tard, tel que Ajouter + nom de colonne Au nom de la table à ajouter, est bon.

Modifier le fichier de migration

Ajoutez ce qui suit au fichier de migration que vous avez créé précédemment.

2020~~_add_column_to_table.rb


  def change
    add_column :users, :isPremium, :boolean #ajouter à
    change_column_null :users, :isPremium, false, false #ajouter à
    change_column_default :users, :isPremium, from: nil, to: false #ajouter à
  end

Dans la partie "add_column: users ,: isPremium ,: boolean", une colonne appelée isPremium de type boolean est ajoutée à la table users. Null est interdit par "change_column_null: users ,: isPremium, false, false". Mais l'utilisateur existant n'a pas de colonne isPremium (null), alors définissez-la également sur false. "Change_column_default: users ,: isPremium, from: nil, to: false" définit la valeur par défaut. Lorsque add_column est terminé, la valeur par défaut est "Null", elle est donc remplacée par false.

Reflété dans la base de données

console


rails db:migrate

La base de données doit être mise à jour en fonction du fichier de migration que vous avez créé.

Définition de paramètres forts

Dans Devise, vous pouvez définir l'adresse e-mail et le mot de passe par défaut, mais lorsque vous ajoutez d'autres colonnes, définissez quelque chose appelé Paramètres forts (nom d'utilisateur, isPremium cette fois, etc.).

application_controller.rb


    before_action :configure_permitted_parameters, if: :devise_controller?

    private
    def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:sign_up, keys:[:username, :isPremium])
    end

Vous pouvez maintenant enregistrer le nom d'utilisateur et les colonnes isPremium au moment de la nouvelle inscription.

Paramètres autour du contrôleur

Avec cela, il est possible de changer manuellement l'isPremium du modèle User et de le diviser en attributs (comme fournir une case à cocher au moment de l'inscription?), Mais cette fois, je vais essayer d'en faire un mécanisme qui bascule automatiquement par lien. Alors créez et acheminez le contrôleur (sautez si vous avez déjà terminé).

console


rails g devise:controllers users

config/routes.rb


devise_for :users, 
  controllers: {
     registrations: 'users/registrations'
  }

Créer un lien

Après cela, collez le lien où vous le souhaitez (cette fois, ce sera home / index). À ce moment-là, je vais permettre de passer des paramètres et de diviser les attributs.

erb:home/index.html.erb


      <%= link_to "S'identifier", new_user_session_path %>
      <%= link_to "Inscription des membres", new_user_registration_path(premium: "false") %>
Inscription aux membres Premium<%= link_to "Ici", new_user_registration_path(premium: "true") %>

L'enregistrement d'adhésion et l'enregistrement d'adhésion premium ont le même "new_user_registration_path", mais nous transmettons une variable appelée premium pour les différencier.

Recevoir des variables sur le contrôleur

Dans "new_user_registration_path", la nouvelle action de RegistrationsController des utilisateurs créés précédemment devrait être appelée, donc je vais l'écrire.

users/registrations_controller.rb


# GET /resource/sign_up
  def new
    @premium = params[:premium] #ajouter à
    super
  end

Décommentez la nouvelle action (#) et mettez la prime que vous venez de passer à @premium. (Ici, j'ai écrit @premium = params [: premium] après super et j'y ai été accro pendant une heure.)

Passer à la vue

Puisqu'il n'est pas nécessaire de l'afficher dans View, utilisez f.hidden_field etc. (les autres formulaires sont omis).

erb:registrations/new.html.erb


<%= f.hidden_field :isPremium, :value => @premium %>

Si vous écrivez ceci à un endroit approprié dans le formulaire, @premium passé à partir du lien sera enregistré dans la colonne isPremium du modèle Utilisateur.

fin

Je l'ai fait pour le moment, mais je n'ai pas l'impression de faire un détour. Après ça, j'étais inquiet car j'avais peu de compréhension des Rails et j'ai appelé super first avec la nouvelle action des inscriptions. S'il vous plaît laissez-moi savoir s'il existe un moyen plus intelligent!

Recommended Posts

[Rails] Enregistrez-vous par attribut du même modèle en utilisant Devise
Essayez d'utiliser l'attribut de requête Ruby on Rails
[Enum] Utilisez des rails enum pour améliorer la lisibilité des données
Une revue du code utilisé par les rails débutants
[Rails] Annuler / modifier la validation du mot de passe du périphérique définie par défaut
Rails6: saisissez les données initiales d'ActionText à l'aide de seed
[Rails] Utilisez la zone déroulante pour trier la liste des articles par date ou par nombre de likes.
[Rails] Introduction aux principes de base du dispositif
Lorsque vous utilisez le constructeur de la classe Date de Java, la date avance de 1900.
[Rails] Lorsque le changement de disposition du dispositif n'est pas reflété
[Rails] Comment afficher une liste de messages par catégorie
Extension du modèle à 4 niveaux de l'architecture prônée par Eric Evans
[Rails] Comment convertir l'URI de l'image envoyée par http en https lors de l'utilisation de l'API Twitter
[Rails] Supprimez le SQL inutile en utilisant le contrôle de cache des associations
Cliquez sur l'image dans le champ file_field de Rails pour télécharger et remplacer l'aperçu
Le problème que l'attribut du modèle User devient nul dans ActionMailer
[rails] Les modifications de la page d'affichage créées par l'appareil ne sont pas reflétées
[Rails 5] Comment afficher l'écran de changement de mot de passe lors de l'utilisation de l'appareil
[Rails] Introduction de Rubocop par les débutants
[Rails] Vérifiez le contenu de l'objet
Explication de l'ordre des itinéraires ferroviaires
Vérifier l'état de migration des rails
[Rails 6] détruit en utilisant la méthode des ressources
[Rails] Je vais expliquer la procédure d'implémentation de la fonction follow en utilisant form_with.
[Enregistrer plusieurs photos] Enregistrer plusieurs images de rails en même temps Technique de puissance primitive
Comment faire de https le schéma de l'URL générée par l'assistant d'URL de Rails
[Rails] Gérez plusieurs modèles à l'aide de la gemme de devise
Essayez d'utiliser || au lieu de l'opérateur ternaire
[Rails] Conservation temporaire des données par session
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (2)
L'identité des paramètres de rails [: id]
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (1)
[Rails] Changer le nom de l'étiquette de f.label
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (3)
Le contenu des données enregistrées par CarrierWave.
[Rails6] Comment connecter la fonction d'affichage générée par Scaffold avec la fonction utilisateur générée par devise