设计用户模型中的未定义方法

时间:2011-01-21 17:03:15

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

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

设计/注册中的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
    ...

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

那看起来倒退了。 collection_select适用于协会的has_many方。请注意,这里的语义提示是当一个对象belongs_to另一个对象时它是单数的。没有涉及收集。你要department并找回一个对象。从另一个方向来看,如果您的Department设置为has_many :users,则要求用户会为您提供用户列表。

看看docs for select。他们给出了一个简单的例子,说明你要对部门做些什么(以选择博客文章的作者的形式)。

答案 2 :(得分:0)

这真的应该有效,我有一个belongs_to:business on my devise用户模型和类似的collection_for_select效果很好。我唯一能想到的是,你的迁移可能还没有运行,而你还没有user.department_id列?

答案 3 :(得分:0)

只是添加我的案例,我遇到了类似的问题。最初每个用户都有一个department_id部门,然后我转移到has_many,忘了从用户删除department_id。解决方案是删除用户的department_id。

相关问题