53 votes

Paramètres non autorisés Ajout de nouveaux champs à Devise dans rails 4.0

Je suis très novice en matière de rails. J'ai mis en place un système de login basique en utilisant Devise. J'essaie d'ajouter quelques nouveaux champs (bio:string, name:string) dans la page d'inscription. J'ai tout affiché correctement et les nouveaux champs sont ajoutés à la base de données (lorsque je les visualise dans SQLbrowser). Cependant, ils ne se remplissent pas et après que l'utilisateur ait soumis le formulaire d'inscription, il y a un message qui dit en partie : "Je n'ai pas besoin d'ajouter de champs :

Unpermitted parameters: bio, name

J'ai ajouté les 2 chaînes au fichier _devise_create_users.rb

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

Et ils apparaissent dans le fichier 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

Mon 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

Ce problème est-il lié aux paramètres forts ? J'ai du mal à les comprendre et à savoir où et comment les mettre en œuvre.

71voto

Pablo Torrecilla Points 433

La solution acceptée est assez bonne, mais je vois deux problèmes : 1) Tous les contrôleurs vérifieront si le contrôleur actuel est le contrôleur de l'appareil ( if: :devise_controller? ) et 2) Nous devons écrire tous les paramètres acceptables dans la méthode ( ...for(:sign_up) {|u| u.permit(:bio, :name)} ), même les :email , :password et ainsi de suite.

Je pense qu'une solution plus élégante pourrait être :

# 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" }

NOTE : Mises à jour pour Rails 4.2+.

Cette réponse n'est plus d'actualité :

40voto

Pedro Nascimento Points 3781

Assurez-vous d'utiliser Devise 3.0.0 au minimum. Ajoutez à votre contrôleur d'application :

before_filter :update_sanitized_params, if: :devise_controller?

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

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

11voto

KMLong Points 178

J'ai également rencontré des difficultés à ce sujet. La documentation sur le site de devise m'a aidé ainsi que certains forums. Voici ce que j'ai fini par faire :

Dans le RegistrationsController personnalisé (app/controllers/users/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

Ensuite, dans votre fichier de route (config/routes.rb), utilisez ceci pour votre devise_for :

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

0voto

Boris Barroso Points 410

Le problème semble venir des paramètres forts, regardez ici et copiez le code.

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

Copiez ce fichier au même endroit dans votre projet app/controllers/devise/registrations_controller.rb

et modifiez le code de l'action de création

# 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

Je dois vous dire que je ne suis pas sûr que cela fonctionne car je n'utilise pas devise mais en voyant le code, il semble que cela fonctionnera.

0voto

danysz Points 183

Devise a tout préparé pour cela :

Dans le contrôleur des utilisateurs, vous avez

private

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X