ActiveRecord关联:nil的未定义方法:NilClass

时间:2013-02-06 20:10:22

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord model-associations

首先这是我的第一个Rails应用程序,所以请放纵......我在http://guides.rubyonrails.org/association_basics.html中阅读了Rails指南,然后开始编写我自己的项目代码。我的问题是我不能做@ project.user.email之类的东西,因为@ project.user似乎一直都是零。这发生在所有对象上。 @ user.role.name也会抛出“nil:NilClass的未定义方法”;我确定我对模型定义做错了但我不明白它是什么。我感谢您的帮助。感谢。

   class Role < ActiveRecord::Base
      has_many :users
      attr_accessible :name
   end

   class User < ActiveRecord::Base
      belongs_to :role
      has_many :projects
      attr_accessible :email, :password, :password_confirmation, :role_id, :role  
   end

   class Project < ActiveRecord::Base
      belongs_to :user
      belongs_to :project_type
      attr_accessible :id, :project_type_id, :title, :description  
   end

   class Project_Type < ActiveRecord::Base
      has_many :projects
      attr_accessible :name
   end

例如,我所做的项目的索引视图(HAML):

   %td= proyecto.user.email

哪个不行。但是,

   %td= proyecto.user_id

工作正常。

1 个答案:

答案 0 :(得分:2)

创建新项目时,除非您在迁移中设置了某种类型的默认值,否则所有关联都将默认为nil。你可以在那里做一些事情。

首先,您可以手动设置用户:

@user = User.find(5)
@project = Project.new
@project.user = @user

此外,您可以从用户构建新项目。从build关联自动添加has_many方法。

@user = User.find(5)
@project = @user.projects.build

现在@project将包含与ID为5的用户关联的项目。您还需要确保告诉Rails关联是什么,否则关联将无效。