未定义的局部变量或方法`user' - 如何使名称显示而不是数字。

时间:2011-09-01 08:37:05

标签: ruby-on-rails ruby-on-rails-3

我有一张表列出了一定数量的经理人。在Manager User Id列中,我试图显示名称而不是整数。我有以下关系

用户模型

has_many :roles, :through => :roles_users
  has_many :projects, :foreign_key => "manager_user_id"

项目

class Project < ActiveRecord::Base
  belongs_to :user, :foreign_key => "manager_user_id"

Index.html.erb

    <tr>


  <td><%= project.project_number %></td>
  <td><%= project.project_name %></td>
  **<td><%= user.project.manager_user_id%></td>**
  <td><center><%= link_to image_tag("icons/user.png"), project %></center></td>
  <td><center><%= link_to image_tag("icons/user_edit.png"), edit_project_path(project) %></center></td>
  <td><center><%= link_to image_tag("icons/user_delete.png"), project, :confirm => 'Are you sure?', :method => :delete %></center></td>

    </tr>

我尝试了以下内容:

  • project.user.manager_user_id
  • user.project.manager_user_id

这些都不起作用,我得到了这个错误:未定义的局部变量或#&lt;#:0xb14cf5c&gt;的方法`user'

我做错了什么。我将上述类似的方法用于另一个表,这很好。

3 个答案:

答案 0 :(得分:1)

就像它说的那样,它是未定义的。

如果您已正确编码AR关联并且<%= project.user.name %>变量可用,则

project应该有效。您还可以在用户模型中定义to_s方法,因此当您在视图中执行<%= user %>时,将显示用户名,而不是“数字”。同样,只要你先准备好user

示例:

class User < ActiveRecord::Base
   def to_s
     name
   end
end

答案 1 :(得分:1)

从您的视图看,您在视图中定义了project,但未user。既然如此,你肯定想要project.user形式。这也是有道理的,因为Project只有一个关联的User,而User有多个Projects,所以user.project是一个数组。

其次,请记住manager_user_idProject的成员,而不是User的成员,因此project.user.manager_user_id将不起作用。

我怀疑你想要project.user.name

答案 2 :(得分:0)

这里发生的是project.user.manager_user_id您正在访问不在users表中的字段,它位于项目表中,因此使用project.user.name您应该能够检索用户名

当您project.user时,Rails实例化与该项目关联的用户,以便您可以访问用户模型中的每个方法和字段。

我假设您已在控制器中加载项目,但未加载用户,因此当您尝试执行undefined local variable or method 'user' for #<#:0xb14cf5c>时出现错误user.project.manager_user_id