2

我是新来的。所以我不是很了解它。我有一个包含三个表的数据库。学生表、课程表和注册表。我的 Railde 模型如下:

class Student < ActiveRecord::Base
  attr_accessible :name
  has_many :registrations
  has_many :courses, :through => :registrations

  validates :name, :presence => true

end

class Course < ActiveRecord::Base
  attr_accessible :name
  has_many :registrations, :dependent => :destroy
  has_many :students, :through => :registrations

  validates :name , :presence => true
  validates :name, :uniqueness => true
end

class Registration < ActiveRecord::Base
  attr_accessible :course_id, :student_id


  belongs_to :course
  belongs_to :student

  validates :course_id, :student_id, :presence => true
  validates :course_id, :uniqueness => {:scope => :student_id}
  validates :student_id, :uniqueness => {:scope => :course_id}
end

……………………………………………………………………………………………………………………

Controller action for updating student :

  def update
    @student = Student.find(params[:id])
    if @student.update_attributes(params[:student])
      redirect_to students_path, :notice => "Registration completed"
    else
      render 'edit'
    end
  end

................ 看法 :

<%=form_for @student do |f| %>
    <p>
      <%= f.label :name, "Name" %>
      <%= f.text_field :name %>
    </p>
    <p>
      <%= render('course_list') %>
    </p>
    <p>
      <%= f.submit %>
    </p>
<% end %>

................ _course_list 部分:

Select Courses :<br/>

        <p>

          <% Course.all.each do |course| %>

              <%=check_box_tag "student[course_ids][]", course.id, `enter code here`@student.course_ids.include?(course.id) %>
              <%= course.name %>  <br/>

          <% end %>
    </p>

.............................当我提交更新按钮时,我收到了一个错误

无法批量分配受保护的属性:course_ids

…………

参数 :

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"j/lDE5bv1gWkfadQ6Cag6hGjg5nD2Ikad9vHOJTE7Pc=",
 "student"=>{"name"=>"Galib",
 "course_ids"=>["2",
 "3"]},
 "commit"=>"Update Student",
 "id"=>"6"} 

…………………………………………………………………………………………………………

我想要做的是,如果单击更新按钮,学生表和注册表都需要更新。请帮忙。

4

3 回答 3

4

在模型中定义关联

class Student < ActiveRecord::Base
  attr_accessible :name
  has_many :registrations
  has_many :courses, :through => :registrations

  validates :name, :presence => true

  accepts_nested_attributes_for :courses
  attr_accessible :course_ids

end

class Course < ActiveRecord::Base
  attr_accessible :name
  has_many :registrations, :dependent => :destroy
  has_many :students, :through => :registrations

  validates :name , :presence => true
  validates :name, :uniqueness => true

  accepts_nested_attributes_for :students
end

class Registration < ActiveRecord::Base
  attr_accessible :course_id, :student_id


  belongs_to :course
  belongs_to :student

  validates :course_id, :student_id, :presence => true
  validates :course_id, :uniqueness => {:scope => :student_id}
  validates :student_id, :uniqueness => {:scope => :course_id}

  accepts_nested_attributes_for :course
end

在控制器中

def update
    @student = Student.find(params[:id])
    if @student.update_attributes(params[:student])
       @student.courses.build
      redirect_to students_path, :notice => "Registration completed"
    else
      render 'edit'
    end
  end

它可以帮助你

于 2013-07-11T05:33:22.677 回答
0

对于 MongoDB,为了在 rails 模型中实现多对多,您必须使用has_and_belongs_to_many而不是简单has_many

于 2013-07-11T05:12:02.483 回答
0

该错误告诉您您有权限错误 -course_ids无法从表单发布。更具体地说,您拥有attr_accessible :nameStudent 模型,这意味着当您使用表单保存学生记录时,这是唯一可以保存的属性(attr_accessible指示可以批量分配的内容)。

尝试将您的学生模型更改为:

attr_accessible :name, :registrations_attributes
accepts_nested_attributes_for :registrations

您正在尝试创建嵌套模型表单,因此为此使用了accepts_nested_attributes_for

如果您还想更新 Registrations 表,您将不得不告诉部分,以便它知道部分正在更新与 Student 不同的模型。

<%= f.fields_for :registrations do |registration| %>
  <%= render('course_list') %>
<% end %>
于 2013-07-11T05:39:47.553 回答