it-swarm.com.de

Unzulässige Parameter, die neue Felder in Rails 4.0

Sehr neu in der Arbeit mit Rails. Ich habe ein grundlegendes Anmeldesystem mit Devise implementiert. Ich versuche ein paar neue Felder (bio: string, name: string) in die Anmeldeseite einzufügen. Ich habe alles richtig angezeigt und die neuen Felder werden der Datenbank hinzugefügt (wenn ich sie in SQLbrowser ansehe), sie werden jedoch nicht ausgefüllt, und nachdem der Benutzer das Anmeldeformular übermittelt hat, wird eine Meldung angezeigt, die besagt, welcher Teil davon lautet:

Unpermitted parameters: bio, name

Ich habe die 2 Zeichenfolgen zur Datei _devise_create_users.rb hinzugefügt

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

Und ich habe sie in der schema.rb angezeigt

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

Mein 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

Hat dieses Problem etwas mit starken Parametern zu tun? Es fällt mir schwer, meinen Kopf um sie zu wickeln und wo/wie ich sie implementieren soll.

53
r-s

Die akzeptierte Lösung ist gut genug, aber ich sehe zwei Probleme: 1) Alle Controller prüfen, ob der aktuelle Controller der Gerätecontroller ist (if: :devise_controller?) Und 2) Wir müssen alle akzeptablen Parameter in die Methode schreiben (...for(:sign_up) {|u| u.permit(:bio, :name)}), sogar :email, :password und so weiter.

Ich denke, dass eine elegantere Lösung sein könnte:

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

HINWEIS: Updates für Rails 4.2 +

Diese Antwort ist veraltet:

71

Stellen Sie sicher, dass Sie mindestens Devise 3.0.0 verwenden. Fügen Sie Ihrem Anwendungscontroller Folgendes hinzu:

before_filter :update_sanitized_params, if: :devise_controller?

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

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

40

Ich hatte auch Probleme damit. Die Dokumentation auf der Website von devise hat ebenso geholfen wie einige Foren. Folgendes habe ich letztendlich getan:

Im benutzerdefinierten RegistrationsController (app/controller/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

Dann geben Sie in Ihrer Routendatei (config/routes.rb) Folgendes für Ihre devise_for-Anweisung ein:

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

Hier ist ein weiterer direkter Weg, der in meiner Rails 4.2.1 App funktioniert:

Erstellen Sie die folgende Datei

/config/initializers/devise_permitted_parameters.rb

und der Code ..

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
4
jtlindsey

Führen Sie dies sowohl für sign_up als auch account_update für controllers/applcation_controller.rb Durch.

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
2
Jerry Zhang

Das Design hat alles darauf vorbereitet:

In der Benutzersteuerung haben Sie

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
0
danysz

Das Problem scheint mit den starken Parametern, schauen Sie hier und kopieren Sie den Code.

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

Kopieren Sie diese Datei an denselben Speicherort in Ihrem Projekt app/controllers/devise/registrations_controller.rb

und ändern Sie den Code der Erstellungsaktion

# 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

Ich muss Ihnen sagen, dass ich nicht ganz sicher bin, ob dies funktioniert, da ich kein Gerät verwende, aber den Code sehe, scheint es, als würde er funktionieren.

0
Boris Barroso