在新控制器方法中使用form_for时的未定义方法

时间:2014-05-18 04:04:00

标签: mysql ruby-on-rails

我在渲染新控制器方法的表单时出现此错误:

未定义的方法`teacher_id'代表# 提取的来源(第8行):

 <table summary="Student form fields">
  <tr>
    <th>Teacher ID</th>
    <td><%= f.number_field :teacher_id %></td>  # this is line 8
  </tr>
  <tr>
    <th>Parent ID</th>

这是new.html.erb:

<h1>Add A Student</h1>

<%= form_for @student, :url => { :action => 'create'}, :html => { :multipart => true } do |f| %>
<table summary="Student form fields">
   <tr>
     <th>Teacher ID</th>
     <td><%= f.number_field :teacher_id %></td>
   </tr>
   <tr>
     <th>Parent ID</th>
     <td><%= f.number_field :parent_id %></td>
   </tr>
   <tr>
     <th>FirstName</th>
     <td><%= f.text_field :firstname %></td>
   </tr>
   <tr>
     <th>LastName</th>
     <td><%= f.text_field :lastname %></td>
   </tr>
   <tr>
     <th>Date of Birth</th>
     <td><%= f.date_field :dob %></td>
   </tr>
   <tr>
     <th>Email</th>
     <td><%= f.email_field :email %></td>
   </tr>
   <tr>
     <th>Cellphone</th>
     <td><%= f.telephone_field :cellphone %></td>
   </tr>
   <tr>
     <th>Username</th>
     <td><%= f.text_field :username %></td>
   </tr>
   <tr>
   <tr>
     <th>Password</th>
     <td><%= f.password_field :password %></td>
   </tr>
   <tr>
     <th>Confirm Password</th>
     <td><%= f.password_field :password_confirmation %></td>
   </tr>
   <tr>
     <th>Address Street#</th>
     <td><%= f.text_field :addr_streetno %></td>
     <th>Apt #</th>
     <td><%= f.number_field :addr_aptno %></td>
   </tr>
   <tr>
     <th>City</th>
     <td><%= f.text_field :addr_city %></td>
     <th>State</th>
     <td><%= f.text_field :addr_state %></td>
     <th>Zip</th>
     <td><%= f.number_field :addr_zip %></td>
   </tr>
   <tr>
     <th>Photo</th>
     <td><%= f.file_field :photo %></td>
   </tr>
</table>

   <%= f.submit 'Create Student' %>
<% end %>

<% if @student.errors.any? %>
    <ul class="Signup_Errors">
    <% for message_error in @student.errors.full_messages %>
      <li>* <%= message_error %></li>
    <% end %>
    </ul>
  <% end %>
</div>

'这是student.rb模型文件:

class Student < ActiveRecord::Base
    #attr_accessor :teacherid, :firstname, :lastname, :dob, :isadult, 
    #              :email, :cellphone, :username, :password, :addr_streetno, 
    #             :addr_city, :addr_state, :addr_zip, :photo

    #has_secure_password

    belongs_to :parent
    belongs_to :teacher

    attr_accessor :email, :password, :password_confirmation

    EMAIL_REGEX = /\A[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\z/i
    validates :username, :presence => true, :uniqueness => true, :length => { :in => 3..20 }
    validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX
    validates_confirmation_of :password

    scope :sorted, lambda { order("students.firstname ASC")}
end

这是学生表的结构:

create_table :students do |t|
   t.references :parents
   t.references :teachers, null: false

   t.string :firstname, null: false
   t.string :lastname, null: false
   t.date :dob, null: false
   t.boolean :isadult, null: false, default: false
   t.string :email, null: false
   t.string :cellphone
   t.string :username, null: false
   t.string :password_digest, null: false
   t.string :addr_streetno
   t.integer :addr_aptno
   t.string :addr_city
   t.string :addr_state
   t.integer :addr_zip
   t.binary :photo, :limit => 0.5.megabyte

   t.timestamps
 end 

2 个答案:

答案 0 :(得分:0)

您的表格定义显示teachers应该是teacher,因为它是belongs_to。应该这样读:

t.references :parent
t.references :teacher, null: false

答案 1 :(得分:0)

Buck Doyle的答案是正确的,但是,为了扩展它,我会提到当你收到no method错误时 - 这意味着你的object没有属性你'正在呼唤

-

<强>属性

你必须记住Ruby中的所有内容都是object,其中Rails填充了一系列attributes。虽然我们在Rails中称它们为attributes,但事实是每个对象(使用Rails Model / Ruby Class创建)都有一系列methods,每次有一个model时都会调用它们它的实例

因此,如果您有attributes,那么您真正要做的就是定义Rails能够调用的methods / model。这就是为什么你可以使用attr_accessor虚拟属性 - 这告诉Ruby class(一个ActiveRecord)包含这些方法

简单地说,您的no method对象将始终使用数据库中的属性以及您设置的任何虚拟属性进行填充。 no method错误意味着您正在尝试调用不存在的属性

-

<强>修正

修复Buck Doyle错误的方法是确保数据库中包含正确的列

正如t.references :teachers, null: false所强调的那样,您最有可能的问题是您在迁移中引用了{{1}},它应该是单数