Ruby on rails 在中添加对现有记录的引用已通过:关联

Ruby on rails 在中添加对现有记录的引用已通过:关联,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我希望有一个表单,通过使用RubyonRails4搜索字段,将现有记录添加到has_many through中 我的模型如下: class Offering < ActiveRecord::Base has_many :students, through: :enrolments has_many :enrolments end class Enrolment < ActiveRecord::Base belongs_to :offering belongs_to

我希望有一个表单,通过使用RubyonRails4搜索字段,将现有记录添加到has_many through中

我的模型如下:

class Offering < ActiveRecord::Base
  has_many :students, through: :enrolments
  has_many :enrolments
end

class Enrolment < ActiveRecord::Base
  belongs_to :offering
  belongs_to :student
end

class Student < ActiveRecord::Base
  has_many :offerings, through: :enrolments
  has_many :enrolments
end
类产品
在我提供的显示页面上,我想要一张“按学生ID添加学生”表格。用户将输入学生的学生id(即不是rails记录的id),然后提交以添加关联

(输入有效的学生ID后,在提交之前,页面最好会自动显示要添加的学生的全名)

但我是个新手,我不知道该怎么做。我的期望是这样的:

<h4>Add Student</h4>
<%= form_for @offering do |f| %>
  <p>
    Student ID: <%= f.text_field @sid %><br>
  </p>
  <p>
    <%= f.submit "Add Student" %>
  </p>
<% end %>
添加学生

学生ID:


其中,sid是一个局部变量,我可以使用它在控制器中查找学生,并使用
@offering.students添加。我遇到了一个类似的挑战,并使用gem和一个小Jquery解决了它

“我的模型”中的has_many:through关联的结构与您的相同,但在父模型和联接模型上包含了“accepts_nested_attributes_for”类方法。在您的情况下,它将是:

class Offering < ActiveRecord::Base
  has_many :students, through: :enrolments
  has_many :enrolments
  accepts_nested_attributes_for :enrolments
end

class Enrolment < ActiveRecord::Base
  belongs_to :offering
  belongs_to :student
  accepts_nested_attributes_for :students
end

class Student < ActiveRecord::Base
  has_many :offerings, through: :enrolments
  has_many :enrolments
end
3。添加一个操作以处理父模型控制器中的ajax调用。在该操作的ajax调用中使用与“url”值相同的名称(并确保允许连接和子模型属性):

默认情况下,“简单表单关联”帮助器会创建一个选择列表。此代码应动态添加与作为列表中的选定选项输入的sid匹配的学生,并在输入失去焦点(jquery中的模糊事件)时在sid表单输入下动态显示学生姓名


希望这有帮助。

我遇到了类似的挑战,并使用gem和一个小Jquery解决了它

“我的模型”中的has_many:through关联的结构与您的相同,但在父模型和联接模型上包含了“accepts_nested_attributes_for”类方法。在您的情况下,它将是:

class Offering < ActiveRecord::Base
  has_many :students, through: :enrolments
  has_many :enrolments
  accepts_nested_attributes_for :enrolments
end

class Enrolment < ActiveRecord::Base
  belongs_to :offering
  belongs_to :student
  accepts_nested_attributes_for :students
end

class Student < ActiveRecord::Base
  has_many :offerings, through: :enrolments
  has_many :enrolments
end
3。添加一个操作以处理父模型控制器中的ajax调用。在该操作的ajax调用中使用与“url”值相同的名称(并确保允许连接和子模型属性):

默认情况下,“简单表单关联”帮助器会创建一个选择列表。此代码应动态添加与作为列表中的选定选项输入的sid匹配的学生,并在输入失去焦点(jquery中的模糊事件)时在sid表单输入下动态显示学生姓名

希望这有帮助

# offering.js.coffee

$('form').on 'blur', '[id="sid"]', (event) ->
        $.ajax
          url: '/set_student_id/'
          type: 'GET'
          dataType: 'json'
          json: true
          data: {student_id: $("input[id='sid']").val()}
          success: (data) ->
            $("[id$='student_id']").html(data.sid)
            $("[id='student_name']).html(data.name)
          error: (data) ->
            console.log "error"
# offerings_controller.rb

def set_student_id
    student = Student.find_by(sid: params[:student_id])
    @sid = "<option value='#{student.id}' selected='selected'>#{student.name}</option>"
    respond_to do |format|
        format.json { render json: {sid: @sid, name: student.name} }
    end
end

def offering_params
    params.require(:offering).permit(enrolments_attributes:[:id, :student_id, students_attributes: [:id, :name]])
end
get "/set_student_id/", to: "offerings#set_student_id"