【问题标题】:ActiveRecords Associations: undefined method for nil:NilClassActiveRecords 关联:nil:NilClass 的未定义方法
【发布时间】:2013-02-06 20:10:22
【问题描述】:

首先这是我的第一个 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

工作正常。

【问题讨论】:

  • 请包含产生错误的代码。
  • for @project.user:你的项目表中有user_id吗?对于 @user.role:从用户模型中的 attr_accessible 中删除 :role
  • @MrTheWalrus 在项目/索引的脚手架视图中,我正在执行此操作 (HAML):%td= project.user.email ...这不起作用,但 project.user_id 可以.
  • 谢谢@SybariteManoj,是的...我在项目表中有user_id。
  • 首先 - 你不需要 attr_accessible 用于 :id。第二 - 提供返回错误的代码。在你的情况下,你更可能需要 habtm 关系

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


【解决方案1】:

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

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

@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 关联是什么,否则关联将不起作用。

【讨论】:

  • 我在控制器中执行此操作:def index @projects = Project.all end 然后在视图中使用 project.user.email 不起作用,但 project.user_id 可以.. .
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 2011-07-27
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多