两个模型之间的关系错误 - 轨道上的红宝石3

时间:2013-06-25 14:25:37

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

请我帮忙!似乎我的协会不能正常工作,但我找不到什么是错的。 我有学生和监护人之间的关系,学生有很多监护人和监护人属于学生

我无法获得以学生形式插入的录取号码,以监护人的形式,似乎没有关系,但我无法解决它!

我不知道为什么用户会投票我的问题! :D我只是不能做这个工作所以我要求帮助:O

students_controller.rb

class StudentsController < ApplicationController
  def index
    @student = Student.all
  end

  def show
    @student = Student.find(params[:id])
  end

  def new
    @student = Student.new
  end

  def create
    @student = Student.new(params[:student])
    if @student.save
      flash[:success] = ' Student Record Saved Successfully. Please fill the Parent Details.'
      redirect_to new_guardian_url
    else
      flash.now[:error] = 'An error occurred please try again!'
      render 'new'
    end
  end

  def edit
  end
end

guardians_controller.rb

class GuardiansController < ApplicationController
  def index
  end

  def show
  end

  def new
    @guardian = Guardian.new
  end

  def edit
  end
end

student.rb

class Student < ActiveRecord::Base
  attr_accessible :address_line1, :address_line2, :admission_date, :admission_no, :birth_place, :blood_group, :city,
                  :class_roll_no, :date_of_birth, :email, :first_name, :gender, :language, :last_name, :middle_name,
                  :phone1, :phone2, :post_code, :religion, :country_id, :nationality_id
  belongs_to :user
  belongs_to :country
  belongs_to :school
  belongs_to :batch
  belongs_to :nationality , class_name: 'Country'
  has_many :guardians
  has_many :student_previous_subject_marks
  has_one :student_previous_data
end

guardian.rb

class Guardian < ActiveRecord::Base
  attr_accessible :city, :dob, :education, :email, :first_name, :income, :last_name, :mobile_phone, :occupation,
                  :office_address_line1, :office_address_line2, :office_phone1, :office_phone2, :relation
  belongs_to :user
  belongs_to :country
  belongs_to :school
  belongs_to :student
end

监护人/ new.html.erb

<h1>Admission</h1>
<h4>Step 2 - Parent details</h4>

<div class="row-fluid">
  <div class="span4 offset1 hero-unit">
    <%= form_for @guardian do |f| %>
        <% if @guardian.errors.any? %>
            <div id="error_explanation">
              <div class="alert alert-error">
                The form contains <%= pluralize(@guardian.errors.count, 'error') %>
              </div>
              <ul>
                <% @guardian.errors.full_messages.each do |msg| %>
                    <li>* <%= msg %></li>
                <% end %>
              </ul>
            </div>
        <% end %>

        <fieldset>
        <div class="field">
          <%= f.label 'Student Admission number' %>
          <%= f.text_field @guardian.student.admission_no %>
        </div>

2 个答案:

答案 0 :(得分:1)

在guardians_controller的新动作中,您创建了监护人的空白对象。所以你没有得到学生入学号码的价值。在这种情况下,您需要添加嵌套资源。

在您的路线文件中添加以下代码

resources :students do
 resources :guardians
end

现在更改students_controller

的创建操作的代码
def create
    @student = Student.new(params[:student])
    if @student.save
      flash[:success] = ' Student Record Saved Successfully. Please fill the Parent Details.'
      redirect_to new_student_guardian_path(@student)
    else
      flash.now[:error] = 'An error occurred please try again!'
      render 'new'
    end
end

您还需要将以下代码添加到guardians_controller的新操作中。

def new
    @guardian = Guardian.new({:student_id => params[:student_id]})
end

现在,您可以在HTML格式中获取相关学生入学人数的价值。

在guardians / new.html.erb中,您需要修改

<%= form_for(@guardian, :url => student_guardians_path(params[:student_id]), :method => 'post') do |f| %>

答案 1 :(得分:0)

第一件事就是,正如你的监护人模型所暗示的那样,我猜你没有任何字段可以存储学生的参考资料。所以,请首先在监护人模型中添加一个字段student_id。你也没有在监护人模型中有admission_no字段。所以,如果你想存储admission_no然后在DB中添加一个字段,如果你只想显示值,在监护人模型中添加

attr_accessor :admission_no

现在,因为在您的GuardiansController的新操作中,您正在创建一个尚未与学生表中的任何记录相关联的对象。所以使用像bachan这样的嵌套资源在他的回答中说,你可以实现目标。

创建嵌套资源: -

resources :students do
 resources :guardians
end

然后在GuardiansController的新动作中

def new
  @student = Student.find(params[:student_id])
  @guardian = Guardian.new
end

现在用

替换你的form_for
<%= form_for([@student, @guardian]) do |f| %>
  .............
  <%= f.text_field :admission_no, :value => @student.admission_no %>
  .............
<% end%>

如果你想在监护人表中存储学生的id。如果没有,那么你可以使用

<%= form_for(@guardian, :url => student_guardians_path(@student), :method => :post) do |f| %>
  .............
  <%= f.text_field :admission_no, :value => @student.admission_no %>
  .............
<% end%>

希望它会对你有所帮助。