rails 4中的ActiveModel :: MissingAttributeError

时间:2013-05-13 17:00:21

标签: ruby-on-rails

这个问题中的代码在Rails 3中没有问题,但它在rails 4中引发了一个ActiveModel :: MissingAttributeError,它也使用了Devise(对于Rails 4)。有三种相关模型,User模型与其他两种模型之间存在多态关系。

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

在用户填写相关注册表后,将在我在注册控制器内重写的Devise的after_sign_up_path_for(用户)方法内为新用户创建新的律师或学生资料,如下所示

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添加到Rails 3应用程序中的attr_accessible列表中,所以我并不完全确定它是一个强大的参数问题。事实上,用户和LawyerProfile模型都没有一个属性(我创建或其他可见)属于profile_id

无论如何,在Application控制器内部,根据Devise说明,我添加了以下内容,为注册时的用户创建了可接受参数的白名单。我在这个列表中添加了: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的一个属性(即使我没有将它添加到Rails 3应用程序中的LawyerProfile.rb attr_accessible)。我的lawyer_profiles控制器中没有创建操作。

问题

1)如果错误消息的原因是我没有为LawyerProfile.rb模型创建属性白名单(即:profile_id),如果我没有创建,我该如何在lawyer_profiles_controller中执行此操作?行动?我只使用LawyerProfile.create!一次。

2)如果不是第一个问题中提到的原因,那么这个错误可能是另一个原因?

更新, 其中一个奇怪的方面是User模型和LawyerProfile模型都没有profile_id列。它们都只有id列,就像Rails 3版本中的情况一样。

1 个答案:

答案 0 :(得分:1)

回答我自己的问题。尽管Rails 3和Rails4应用程序之间的代码完全相同,但Rails 4应用程序中出现了错误,因为我在users表上没有profile_id(或profile_type)列。由于我没有将它保存到Rails 3应用程序中的db,因此它没有引发错误。我没有将它保存到Rails 4应用程序中的数据库,但Rails现在在这种情况下引发错误。