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/3350730

BEARBEITEN:

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)?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage