Rails 4 / Devise / MongoDB: “Parâmetros não autorizados” usando propriedades personalizadas e parâmetros fortes
Tentando adicionar um atributo personalizado aninhadoPerfil (um documento mongóide), para meu legadoDo utilizador classe. Quando o formulário de registro do Devise é enviado, ele deve criar umDo utilizador e um correspondentePerfil objeto também.
Eu gostaria que o resultado final se parecesse com isso no meu MongoDB:
Do utilizador:
{
# Devise fields:
"email": "[email protected]",
...
# Custom field
"profile" : "<object_id>"
}
Perfil:
{
"first_name": "Dave",
....
}
Infelizmente, estou recebendo isso no meu console sempre que envio meu registro. Ele cria com sucesso um usuário, mas não consegue criar um perfil associado.
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
Eu tenho configuração:
Rails 4.0.0beta1, Ruby 2.0.0-p0Devise (ramificação 'rails4'), Mongoid (do git)Um controlador de registros do Devise customizado para incluir uma definição para parâmetros fortes.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
controllers / users / 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"
}
Eu já vi essas postagens relacionadas, elas não pareciam ajudar:
Rails 4 Atributos Aninhados Parâmetros Não Permitidoshttps://gist.github.com/kazpsp/3350730EDITAR:
Parece que o Devise realmente suporta parâmetros fortes em sua ramificação 'rails4' (que deve ser mesclada no master em alguns dias). Olhando através do código, parece que você pode sobrescrever uma função params para cada ação nos controladores de legendas. Para criar novos usuários, suasign_up_params
ao invés deresource_params
no meu exemplo.
Apesar de mudar este nome para o correto, ainda assim não funcionou ... apenas colocar todos os parâmetros na lista de permissões usando esse estrondo pareceu funcionar:
def sign_up_params
params.require(:user).permit!
end
Obviamente, este tipo de derrota o propósito de parâmetros fortes ... então agora a questão é como permitir meus atributos aninhadosprofile_attributes
(como visto na minha pergunta original)?