【问题标题】:Undefined method in devise user model设计用户模型中的未定义方法
【发布时间】:2025-12-24 22:15:16
【问题描述】:

我对 rails 还很陌生,并试图将 belongs_to 关联添加到我的 Devise User 模型中。 尝试渲染视图时出现的错误:

设计/注册中的 NoMethodError#edit #

的未定义方法 `department_id'

在我看来,这个错误发生在 collection_select 上。这个方法不是belongs_to关联提供的吗?

用户模型

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :invitable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  belongs_to :department
end

编辑视图

%h2
  Edit #{resource_name.to_s.humanize}
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f|
  = devise_error_messages!
  %p
    = f.label :email
    %br/
    = f.text_field :email
  %p
    = f.label :department
    %br/
    = collection_select(resource_name, :department_id, Department.all, :id, :name)
  %p
    ...

【问题讨论】:

    标签: ruby-on-rails devise belongs-to


    【解决方案1】:

    正如@njorden 所说,请务必执行以下操作:

    1. 迁移以将department_id 添加到您的用户表中
    2. attr_accessible :department_id 允许通过编辑注册表进行批量分配

    【讨论】:

      【解决方案2】:

      这真的应该有效,我的设计 User 模型上有一个 belongs_to :business ,一个类似的 collection_for_select 效果很好。我唯一能想到的可能是您的迁移尚未运行,并且您还没有 user.department_id 列?

      【讨论】:

      • 你是对的,问题是我在迁移已经在这个数据库上运行之后更改了迁移。我现在觉得自己很蠢。
      • 啊,很高兴它成功了!有时第二双眼睛会有所不同;-)
      【解决方案3】:

      这看起来是向后的。 collection_select 适用于关联的 has_many 端。请注意,这里的语义提示是当一个对象belongs_to 另一个对象时,它是单数的。不涉及收集。你要求department 并取回一个对象。从另一个方向看,如果您的Department 设置为has_many :users,那么询问用户会给您一个用户列表。

      看看docs for select。他们提供了一个简单的示例,说明您尝试对部门做什么(以选择博客文章作者的形式)。

      【讨论】:

        【解决方案4】:

        只是为了补充我的情况,我遇到了类似的问题。最初每个用户都有一个部门 ID,然后我搬到了一个 has_many,忘记从用户中删除部门 ID。解决方案是删除用户的 department_id。

        【讨论】: