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.
console
Windows10
ruby 2.6.6
Rails 6.0.3.1
psql (PostgreSQL) 12.3
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.
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.
console
rails db:migrate
La base de données doit être mise à jour en fonction du fichier de migration que vous avez créé.
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.
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'
}
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.
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.)
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.
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!