Rails 4 / Devise / MongoDB: «недопустимые параметры» с использованием пользовательских свойств и сильных параметров
Пытаясь добавить вложенный пользовательский атрибут,Профиль (Mongoid документ), к моему устройствупользователь класс. Когда форма регистрации Devise представлена, она должна создатьпользователь и соответствующийПрофиль объект также.
Я бы хотел, чтобы конечный результат выглядел примерно так в моем MongoDB:
Пользователь:
{
# Devise fields:
"email": "[email protected]",
...
# Custom field
"profile" : "<object_id>"
}
Профиль:
{
"first_name": "Dave",
....
}
К сожалению, я получаю это в своей консоли всякий раз, когда я отправляю свою регистрацию. Он успешно создает пользователя, но не может создать связанный профиль.
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
У меня есть настройки:
Rails 4.0.0beta1, Ruby 2.0.0-p0Devise (ветка 'rails4'), Mongoid (из мерзавца)Пользовательский контроллер регистрации Devise для добавления определения сильных параметров.модели / 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
модели / 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
Контроллеры / пользователи / 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"
}
Я уже посмотрел на эти связанные посты, они, кажется, не помогают:
Вложенные атрибуты Rails 4: недопустимые параметрыhttps://gist.github.com/kazpsp/3350730РЕДАКТИРОВАТЬ:
Похоже, что Devise действительно поддерживает сильные параметры в своей ветке 'rails4' (которая должна быть объединена с мастером через несколько дней.) Из кода видно, что вы можете переопределить функцию params для каждого действия на контроллерах devise. Для создания новых пользователей, егоsign_up_params
вместоresource_params
в моем примере.
Несмотря на то, что это имя было изменено на правильное, оно все равно не работало ... казалось, что работает только белый список всех параметров, использующих этот удар:
def sign_up_params
params.require(:user).permit!
end
Очевидно, что этот вид побеждает назначение сильных параметров ... поэтому теперь вопрос заключается в том, как разрешить мои вложенные атрибутыprofile_attributes
(как видно из моего оригинального вопроса)?