Aggiunta di campi di registrazione aggiuntivi con Devise

Sto cercando di aggiungere alcuni campi extra alle registrazioni # nuove. Dato che desidero solo dati extra e non necessitano di funzionalità diverse, non vedo perché ho bisogno di sovrascrivere i controller, ecc. Quindi quello che ho fatto è stato modificare le registrazioni # nuove come segue:

inserisci la descrizione dell'immagine qui

Per abilitare questi campi extra attraverso il disinfettante, ho aggiornato ApplicationController come segue:

inserisci la descrizione dell'immagine qui

Per qualche ragione, non funziona e i campi extra vanno al database come valori nulli.

Sto usando Ruby 2 e Rails 4 rc1, con Devise 3.0.0.rc.

Sembrerebbe che l’esempio di codice nella tua domanda non funzioni perché non stai impostando before_filter per chiamare il disinfettante.

before_filter :configure_permitted_parameters, if: :devise_controller? 

Detto questo, è probabilmente meglio ignorare il controller, come mostrato nella risposta accettata, in modo che il controller dell’applicazione non stia effettuando questo controllo tutto il tempo. La risposta accettata può essere abbreviata con il codice seguente. Ho provato questo codice con la mia applicazione e funziona bene. Tutto ciò è documentato nella sezione Strong Parameters del README nel tag 3.0.0.rc.

Sostituisci il controller:

 class RegistrationsController < Devise::RegistrationsController before_filter :configure_permitted_parameters, :only => [:create] protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password) } end end 

Quindi aggiorna i percorsi per usarlo:

 devise_for :members, :controllers => { :registrations => "registrations" } 

OK, quindi quello che ho fatto è stato semplicemente scavalcare il controller di registrazione Devise, aggiornare routes.rb secondo i documenti di sviluppo per riflettere, copiare e incollare il codice Devise per le registrazioni # create così com’è, e cambiare la parte get params per usare il mio metodo di parametri forti, e questo era quello.

 class RegistrationsController < Devise::RegistrationsController def create build_resource(registration_params) if resource.save if resource.active_for_authentication? set_flash_message :notice, :signed_up if is_navigational_format? sign_up(resource_name, resource) respond_with resource, :location => after_sign_up_path_for(resource) else set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format? respond_with resource, :location => after_sign_up_path_for(resource) end else clean_up_passwords respond_with resource end end private def registration_params params.require(:user).permit(:email, :title_id, :first_name, :last_name, :province_id, :password, :password_confirmation) end end 

Dopo Devise 4.0 le risposte più vecchie su questo argomento non sono valide. invece del metodo for devi usare:

 devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) 

Quindi, per una soluzione completa in ApplicationController :

 class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) end end 

Ho avuto una situazione simile (solo i campi erano diversi).

Ecco come può offrire la documentazione ufficiale: aggiungilo al tuo ApplicationController. E cambia “nome utente” in base alle tue esigenze e aggiungine altre se necessario.

 before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :username end 

Il mio controller di applicazioni è simile al seguente:

 class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :public_name end end 

Maggiori dettagli qui: https://github.com/plataformatec/devise ("Strong Parameters")

Prima esporre le viste

 rails generate devise:views users 

quindi modifica config / initializers / devise.rb e cambia

 # config.scoped_views = false 

a

 config.scoped_views = true 

questo ti consentirà di modificare le viste in app / visualizzazioni / utenti / registrazione.

aggiungerai i campi necessari qui, in entrambi

app/views/users/registration/edit.html.erb

 app/views/users/registration/new.html.erb 

Ora dobbiamo occuparci del problema dell’assegnazione di massa dei binari, andare su application_controller.rb e aggiungere un before_filter

 before_filter :configure_permitted_parameters, if: :devise_controller? 

quindi aggiungi i campi + i campi originali per escogitare la sanitizzazione

 protected def configure_permitted_parameters # Fields for sign up devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password) } # Fields for editing an existing account devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :current_password, :gender) } end 

riavvia il tuo server web e incrocia le dita.

A partire da Devise versione 4.3.0, 15 maggio 2017, la soluzione è la seguente dalla documentazione. In questo caso, viene aggiunto il campo del nome utente.

Nel caso in cui si desideri consentire parametri aggiuntivi (il modo lazy ™), è ansible farlo utilizzando un filtro semplice prima di ApplicationController:

 class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) end end 

E, naturalmente, aggiungi semplicemente il campo al tuo database

 > rails g migration AddUsernameToUsers class AddUsernameToUsers < ActiveRecord::Migration[5.0] def change add_column :users, :username, :string, null: false, index: true, unique: true end end 

E poi aggiungi i campi necessari nella vista per le registrazioni # nuove

 <%= f.text_field :username, placeholder: "Username" %> 

Primo: non c’è un nuovo problema con i “parametri forti” con le guide 4, potresti voler esaminare anche questo.

Se si migrano i nuovi parametri nel modello utente. Quindi tutto ciò che devi fare è sovrascrivere (creare) i file:

 app/views/devise/registrations/edit.html.erb app/views/devise/registrations/new.html.erb 

puoi guardare i file predefiniti qui: https://github.com/plataformatec/devise/tree/master/app/views/devise/registrations

Se desideri implementare un proprio registrations_controller.rb (con azioni new e edit) e il tuo @variables, è importante aggiungerlo nel tuo route.rb

 devise_for :users, :controllers => { :registrations => 'registrations' } resources :users 

Questo assicura che da quel momento in poi prenderà il tuo nuovo controller delle ‘registrazioni’ (se ne hai deciso uno).

Non conosco il “disinfettante” o ciò per cui è buono. Ma la mia app funziona perfettamente con quei piccoli cambiamenti che ti ho appena consigliato. Non è necessario eseguire l’override del controller! Sovrascrivere le visualizzazioni sarà sufficiente.