Rails 4 / Devise / MongoDB: "Unzulässige Parameter" mit benutzerdefinierten Eigenschaften und starken Parametern
Beim Versuch, ein verschachteltes benutzerdefiniertes Attribut hinzuzufügen,Profil (ein mongoides Dokument), zu meiner EinbildungNutzer Klasse. Wenn das Devise-Registrierungsformular eingereicht wird, sollte es beides erstellen: aNutzer und eine entsprechendeProfil Objekt auch.
Ich möchte, dass das Endergebnis in meiner MongoDB so aussieht:
Nutzer:
{
# Devise fields:
"email": "[email protected]",
...
# Custom field
"profile" : "<object_id>"
}
Profil:
{
"first_name": "Dave",
....
}
Leider erhalte ich dies in meiner Konsole, wenn ich meine Registrierung abschicke. Es erstellt erfolgreich einen Benutzer, kann jedoch kein zugeordnetes Profil erstellen.
Started POST "/" for 127.0.0.1 at 2013-04-20 23:37:10 -0400
Processing by Users::RegistrationsController#create as HTML
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"awN2GU8EYEfisU0",
"user"=>
{"profile_attributes"=>
{"first_name"=>"Dave",
"birthday(2i)"=>"4",
"birthday(3i)"=>"21",
"birthday(1i)"=>"1933",
"occupation_title"=>"Software Developer"},
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"email"=>"[email protected]"}}
Unpermitted parameters: profile_attributes
Ich habe eingerichtet:
Schienen 4.0.0beta1, Ruby 2.0.0-p0Devise ('Rails4'-Zweig), Mongoid (von Git)Ein benutzerdefinierter Controller für Devise-Registrierungen, um eine Definition für starke Parameter hinzuzufügen.models / user.rb:
class User
include Mongoid::Document
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:token_authenticatable, :confirmable, :lockable, :timeoutable
field :email, type: String, default: ''
...
has_one :profile
accepts_nested_attributes_for :profile
end
models / profile.rb:
class Profile
include Mongoid::Document
include Mongoid::Timestamps
# Attributes
# ----------
field :slug, type: String, default: '' # Acts as user-'friendlier' slug
field :birthday, type: DateTime, default: DateTime.now
field :first_name, type: String, default: ''
field :occupation_title, type: String, default: ''
belongs_to :user
embeds_many :photos
has_one :occupation_industry, :as => :industry
end
controller / benutzer / registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
def resource_params
params.require(:user).permit(:email, :password, :password_confirmation, :profile_attributes)
end
private :resource_params
end
routes.rb
devise_for :users,
:path => '',
:path_names => {
:sign_in => 'login',
:sign_out => 'logout',
:sign_up => 'register'
},
:controllers => {
:registrations => "users/registrations",
:passwords => "users/passwords"
}
Ich habe diese verwandten Beiträge bereits angeschaut, sie schienen nicht zu helfen:
Rails 4-geschachtelte Attribute Nicht zulässige Parameterhttps://gist.github.com/kazpsp/3350730BEARBEITEN:
Es sieht so aus, als ob Devise tatsächlich starke Parameter in seinem 'Rails4'-Zweig unterstützt (der in ein paar Tagen zum Master zusammengeführt werden soll). Wenn Sie den Code durchsehen, können Sie anscheinend eine params-Funktion für jede Aktion auf Devise-Controllern überschreiben. Um neue Benutzer anzulegen, müssen Siesign_up_params
anstattresource_params
in meinem Beispiel.
Obwohl dieser Name in den richtigen Namen geändert wurde, funktionierte er immer noch nicht ... nur die Whitelist aller Parameter, die diesen Knall verwendeten, schien zu funktionieren:
def sign_up_params
params.require(:user).permit!
end
Offensichtlich vereitelt diese Art das Ziel starker Parameter. Jetzt stellt sich die Frage, wie ich meine verschachtelten Attribute zulasseprofile_attributes
(wie in meiner ursprünglichen frage gesehen)?