2011-01-21 55 views
1

我是相当陌生的rails,并试图将belongs_to关联添加到我的Devise User模型。 错误我在尝试渲染视图时:在设计用户模型中未定义的方法

NoMethodError在设计/注册#编辑 未定义的方法`部门标识”为#

这个错误在我看来,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 
    ... 

回答

0

这真的应该工作,我有一个belongs_to:业务在我的设计用户模型和类似的collection_for_select很好。我唯一能想到的是,也许你的迁移没有运行,你还没有user.department_id列呢?

+0

你说得对,问题是我已经在这个数据库上运行后改变了迁移。我现在感到很蠢。 – tdahlke 2011-01-21 20:11:44

0

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

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

2

正如@njorden提到,一定要做到以下几点:

  1. 迁移添加department_id给用户表
  2. attr_accessible :department_id允许通过编辑注册表质量分配
0

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

相关问题