Rails 4 / Devise / MongoDB: "Parámetros no permitidos" usando propiedades personalizadas y parámetros fuertes
Tratando de agregar un atributo personalizado anidado,Perfil (Un documento de Mongoid), a mi gusto.Usuario clase. Cuando se envía el formulario de registro de Devise, debe crear tanto unUsuario y un correspondientePerfil objeto también.
Me gustaría que el resultado final se vea algo así en mi MongoDB:
Usuario:
{
# Devise fields:
"email": "my@email.com",
...
# Custom field
"profile" : "<object_id>"
}
Perfil:
{
"first_name": "Dave",
....
}
Desafortunadamente, recibo esto en mi consola cada vez que envío mi registro. Crea con éxito un usuario, pero no logra crear un perfil asociado.
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"=>"my@email.com"}}
Unpermitted parameters: profile_attributes
He configurado:
Rieles 4.0.0beta1, Ruby 2.0.0-p0Devise (rama 'rails4'), Mongoid (de git)Un controlador personalizado de registros de Devise para agregar una definición de parámetros fuertes.modelos / usuario.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
modelos / perfil.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
controladores / usuarios / 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
rutas.rb
devise_for :users,
:path => '',
:path_names => {
:sign_in => 'login',
:sign_out => 'logout',
:sign_up => 'register'
},
:controllers => {
:registrations => "users/registrations",
:passwords => "users/passwords"
}
Ya he visto estas publicaciones relacionadas, no parecieron ayudar:
Parámetros anidados de Rails 4 Parámetros no permitidoshttps://gist.github.com/kazpsp/3350730EDITAR:
Parece que Devise realmente admite parámetros fuertes en su rama 'rails4' (que se supone que se fusionará con el maestro en unos días). Al revisar el código, parece que puede anular una función params para cada acción en los controladores de dispositivos. Para crear nuevos usuarios, sussign_up_params
en lugar deresource_params
en mi ejemplo
A pesar de cambiar este nombre por el correcto, aún no funcionó ... solo funcionó la lista blanca de todos los parámetros que usan esta explosión:
def sign_up_params
params.require(:user).permit!
end
Obviamente, este tipo de derrota al propósito de los parámetros fuertes ... así que ahora la pregunta es cómo permito que mis atributos anidadosprofile_attributes
(como se ve en mi pregunta original)?