Код в этом вопросе работает без проблем в Rails 3, но он поднимает ActiveModel :: MissingAttributeError в rails 4, который также использует Devise (для Rails 4). Существуют три подходящие модели с полиморфным соотношением между моделью пользователя и двумя другими.ActiveModel :: MissingAttributeError в rails 4
User.rb
belongs_to :profile, polymorphic: true
LawyerProfile.rb
has_one :user, as: :profile, dependent: :destroy
LawStudentProfile.rb
has_one :user, as: :profile, dependent: :destroy
После того, как пользователь заполняет соответствующую форму регистрации, новый адвокат или профиль студента создается для нового пользователя внутри метода after_sign_up_path_for (пользователя) из Devise, который я переписал Иттен внутри контроллера регистраций, как этот
class RegistrationsController < Devise::RegistrationsController
def after_sign_up_path_for(user)
if user.lawyer === true
user.profile = LawyerProfile.create!
user.add_role :lawyer
user.save!
elsif user.student === true
user.profile = LawStudentProfile.create!
user.add_role :student
user.save!
else
...
Я получаю ошибку на этой линии (на адвоката зарегистрироваться)
user.profile = LawyerProfile.create!
с этим сообщением об ошибке
ActiveModel::MissingAttributeError in RegistrationsController#create
can't write unknown attribute `profile_id'
Как Я работал над приложением Rails 3, я предполагаю, что это может быть связано с сильными параметрами, однако мне никогда не приходилось добавлять profile_id в список attr_accessible
в приложении Rails 3, поэтому я не целиком rtain это сильная проблема с параметрами. Фактически, ни пользователь, ни модель LawyerProfile не имеют атрибута (который я создал или который в противном случае видим) называется profile_id
В любом случае, внутри контроллера приложений, в соответствии с инструкциями по разработке, я добавил после чего создается белый список принятых параметров для пользователя при регистрации. Я добавил: profile_id в этот список, но у меня все еще такая же ошибка.
before_filter :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:name, :email, :lawyer, :student, :password) }
end
Не будучи совсем понятно, о полиморфных ассоциаций, я подумал, может быть: profile_id является атрибутом LawyerProfile (даже если я не добавить его в LawyerProfile.rb attr_accessible
в Rails 3 приложения). В моем контроллере lawyer_profiles не создано никаких действий.
Вопросы
1), если причина сообщения об ошибке, что я не создал белый список атрибутов (т.е. profile_id) для модели LawyerProfile.rb, как это сделать, что в lawyer_profiles_controller, если я у вас нет действия для создания? Я использую только LawyerProfile.create! один раз.
2) что может быть другой причиной этой ошибки, если это не причина, о которой упоминается в первом вопросе?
Обновление, Нечетным аспектом этого является то, что ни модель пользователя, ни модель LawyerProfile не имеют столбец profile_id
. Оба они имеют только столбцы id, как это было в версии Rails 3.
Итак, как вы решили эту проблему? –