2

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

用户.rb

  belongs_to :profile, polymorphic: true

律师简介.rb

 has_one :user, as: :profile, dependent: :destroy

LawStudentProfile.rb

has_one :user, as: :profile, dependent: :destroy

用户填写相关注册表单后,在我已在注册控制器中重写的 Devise 的 after_sign_up_path_for(user) 方法中为新用户创建新的律师或学生档案,如下所示

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_accessibleRails 3 应用程序的列表中,所以我不完全确定它是强参数问题。事实上,用户和 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 的一个属性(即使我没有将它添加到 attr_accessibleRails 3 应用程序中的 LawyerProfile.rb 中)。我的lawyer_profiles 控制器中没有创建操作。

问题

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

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

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

4

1 回答 1

1

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

于 2013-05-14T13:35:39.347 回答