2013-05-13 4 views
2

Код в этом вопросе работает без проблем в 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.

ответ

1

Отвечая на мой вопрос. Несмотря на то, что код был точно таким же между Rails 3 и Rails4, в приложении Rails 4 произошла ошибка, потому что у меня не было столбца profile_id (или profile_type) в таблице пользователей. Поскольку я не сохранял его в db в приложении Rails 3, он не вызывал ошибки.Я не сохранял его в db в приложении Rails 4, но Rails теперь вызывает ошибку в этой ситуации.

+1

Итак, как вы решили эту проблему? –

Смежные вопросы