Parametri non specificati che aggiungono nuovi campi a Devise in rail 4.0

Molto nuovo a lavorare con le guide. Ho implementato un sistema di login di base usando Devise. Sto cercando di aggiungere un paio di nuovi campi (bio: string, name: string) nella pagina sign_up. Ho tutto visualizzato correttamente e i nuovi campi vengono aggiunti al database (quando lo visualizzo in SQLbrowser) tuttavia, non sono popolati e dopo che l’utente invia il modulo sign_up c’è un messaggio che parte di esso dice:

Unpermitted parameters: bio, name 

Ho aggiunto le 2 stringhe a _devise_create_users.rb

  # added t.string :bio t.string :name 

E li faccio vedere nello schema.rb

 ActiveRecord::Schema.define(version: 20130629002343) do create_table "users", force: true do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.integer "sign_in_count", default: 0 t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" t.datetime "created_at" t.datetime "updated_at" t.string "shortbio" t.boolean "admin", default: false t.string "realname" t.string "name" t.string "bio" end add_index "users", ["email"], name: "index_users_on_email", unique: true add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end 

Il mio user.rb

 class User < ActiveRecord::Base # Include default devise modules. Others available are: #:token_authenticatable, :confirmable, #:lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable end 

Questo problema ha qualcosa a che fare con Strong Parameters? Sto attraversando un periodo difficile avvolgendomi attorno a loro e dove / come implementare.

La soluzione accettata è abbastanza buona, ma vedo due problemi: 1) Tutti i controller controlleranno se il controller corrente è il controller di sviluppo ( if: :devise_controller? ) E 2) Abbiamo bisogno di scrivere tutti i parametri accettabili nel metodo ( ...for(:sign_up) {|u| u.permit(:bio, :name)} ), anche :email ...for(:sign_up) {|u| u.permit(:bio, :name)} :password e così via.

Penso che una soluzione più elegante potrebbe essere:

 # app/controllers/users/registrations_controller.rb class Users::RegistrationsController < Devise::RegistrationsController before_filter :configure_permitted_parameters protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up).push(:name, :phone, :organization) end end # config/routes.rb devise_for :users, :controllers => { :registrations => "users/registrations" } 

NOTA: aggiornamenti per Rails 4.2+

Questa risposta non è aggiornata:

  • Cambia “utenti” in “utente” nel percorso “utenti / registrazione” per Rails 4.2.1 e Devise 3.4.1.
  • devise_parameter_sanitizer.permit() sostituisce devise_parameter_sanitizer.for() per Devise 4 (vedi Rails 5, metodo indefinito `for ‘per #

Assicurati di utilizzare almeno Devise 3.0.0. Aggiungi al controller dell’applicazione:

 before_filter :update_sanitized_params, if: :devise_controller? def update_sanitized_params devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:bio, :name)} end 

Documentazione: https://github.com/plataformatec/devise#strong-parameters

Anch’io stavo avendo problemi con questo. La documentazione sul sito di devise ha aiutato così come alcuni forum. Ecco cosa ho finito per fare:

In RegistrationsController personalizzato (app / controller / utenti / registrations_controller.rb)

 # app/controllers/users/registrations_controller.rb class Users::RegistrationsController < Devise::RegistrationsController before_filter :update_sanitized_params, if: :devise_controller? def update_sanitized_params devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:name, :email, :password, :password_confirmation)} end end 

Poi nel tuo file di percorso (config / routes.rb) noi questo per la tua dichiarazione di devise_for:

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

Ecco un altro modo semplice che funziona nella mia app Rails 4.2.1:

Crea il seguente file

 /config/initializers/devise_permitted_parameters.rb 

e il codice ..

 module DevisePermittedParameters extend ActiveSupport::Concern included do before_filter :configure_permitted_parameters end protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :name devise_parameter_sanitizer.for(:account_update) << :name devise_parameter_sanitizer.for(:sign_up) << :bio devise_parameter_sanitizer.for(:account_update) << :bio end end DeviseController.send :include, DevisePermittedParameters 

Sia per sign_up che per account_update fai questo per controllers/applcation_controller.rb

 class ApplicationController < ActionController::Base protect_from_forgery with: :exception before_action :authenticate_user! before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:password, :password_confirmation,:current_password,:email,:name, :phonenumber,:province,:city,:area,:idcardimg,:role) } devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:password, :password_confirmation,:current_password,:email,:name, :phonenumber,:province,:city,:area,:idcardimg,:role) } end end 

Il problema sembra con i parametri forti, guarda qui e copia il codice.

https://github.com/plataformatec/devise/blob/rails4/app/controllers/devise/registrations_controller.rb

Copia quel file nella stessa posizione nell’app di progetto app/controllers/devise/registrations_controller.rb

e cambia il codice dell’azione di creazione

 # POST /resource def create # THIS LINE IS THE ONE YOU CHANGE self.resource = build_resource(sign_up_params.merge(:bio, :name)) 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? expire_session_data_after_sign_in! respond_with resource, :location => after_inactive_sign_up_path_for(resource) end else clean_up_passwords resource respond_with resource end end 

Devo dirti che Iam non è sicuro che funzioni perché non uso la funzione ma vedendo il codice sembra funzionerà.

Devise preparato tutto per quello:

Nel controller degli utenti che hai

 private # Never trust parameters from the scary internet, only allow the white list through. def user_params params.require(:user).permit(:full_name ) end