Ruby on rails - show.html.erb中的未定义方法

时间:2015-11-16 11:55:15

标签: ruby-on-rails methods undefined

我正在尝试显示教师的名称,而不仅仅是ID。

除了我试图显示教师姓名的部分外,其他所有工作都有效。我得到一个错误说"未定义的方法" 。

我知道我做错了什么,但即使我已经看了好几个小时,我根本想不通。我是一个完全初学者,我真的很感谢你的帮助。

谢谢。

show.html.erb

€11853724112355

student.rb

<p id="notice"><%= notice %></p>
<!-- notice is a ruby method, and its results comes here inside the tags
used when you want the errow page to show on the next page -->
<p>
  <strong>Name:</strong>
  <%= @student.name %> 
</p>

<p>
  <strong>Faculty:</strong>
  <%= @student.faculty_id %>
  <%= @name.faculty_id %> 


</p>

 <strong>Grade:</strong>
  <%= @student.grade%>
</p>

<%= link_to 'Edit', edit_student_path(@student) %> |
<%= link_to 'Back', students_path %>

faculty.rb

class Student < ActiveRecord::Base
    belongs_to :faculty

end
class Name < ActiveRecord::Base
    belongs_to :faculty
end

这是我的students_controler.rb

class Faculty < ActiveRecord::Base
    has_many :student
    # belongs_to :faculty
    has_many :name
end

错误是未定义的方法`faculty_id&#39;为零:NilClass

3 个答案:

答案 0 :(得分:3)

  

我正在尝试显示教师的姓名,而不仅仅是ID

由于您是初学者,请让我为您解释一下......

-

您目前正在调用@student.faculty_id

这是@student对象的foreign_key - 将此student对象链接到相应faculty对象的标识符。

简而言之,这意味着此属性是student架构的一部分 - 您需要一个属于faculty架构的属性。因此,您需要使用delegatename调用faculty属性,或直接调用它:

@student.faculty.name

您的模型关联存在更深层次的问题。 enter image description here

The above是如何设置的:

#app/models/student.rb
class Student < ActiveRecord::Base
   belongs_to :faculty
end

#app/models/faculty.rb
class Faculty < ActiveRecord::Base
   has_many :students
end

以上内容可让您拨打以下电话:

#app/controllers/students_controller.rb
class StudentsController < ApplicationController
   def show
      @student = Student.find params[:id]
   end
end

#app/views/students/view.html.erb
<%= @student.faculty.name %>

你必须记住Rails在relational database之上工作。这可以通过允许您通过外键调用相关对象来实现。

如果需要,我可以解释更多。

答案 1 :(得分:0)

<%= @name.faculty_id %>无效。

在你的控制器中急切加载教师

def show
  @student = Student.includes(:faculty)
end

要么

<% if @student.faculty.present? %>
  <%= @student.faculty.name %>
<% end %>

或者您可以获得控制器中的教员并将其分配给变量

def show
  @student = Student.includes(:faculty)
  @faculty = @student.faculty
end

然后你可以使用

<% if @faculty.present? %>
  <%= @faculty.name %>
<% end %>

答案 2 :(得分:0)

我看到的错误是

class Faculty < ActiveRecord::Base
has_many :student
# belongs_to :faculty
has_many :name
end

应该是

class Faculty < ActiveRecord::Base
has_many :students
# belongs_to :faculty
has_many :names
end

我不知道你的错误是由于这个或不是但has_many不是单数形式