嵌入 ActiveRecord 查询,.each do 块到 AJAX 请求

Embedding ActiveRecord query, .each do block into AJAX request

我正在尝试在 Rails 中构建一个仪表板,其中数据根据队列名称的下拉列表进行更改 - 这将清空仪表板中的所有当前数据,并使用相应的新学生列表填充它到那个队列。通过我在其他主题中阅读的内容,我更改了我非常糟糕的代码并在 AJAX 请求中编写了以下内容:

<% Student.where(cohort_id: Cohort.find_by(name: choice).id).each do |student| %>
    $studentList.append(
      '<a href="/students/<%=student.id%>"><%= student.first_name %> <%= student.last_name%></a>')
<% end %>

AJAX 请求当前能够更改仪表板中 headers 的文本值,并且能够在加载时清空学生列表 pre-populated 的内容,但包括这三行会产生一个错误:Unexpected token %。

我在 .js.erb 文件的资产文件夹中工作,小脚本和表达式似乎适用于我研究过的主题。

我错过了什么?我应该尝试使用另一种方法来加载它吗?

谢谢

编辑:

这就是我的讲师控制器(这是供讲师使用的仪表板)和破折号。js.erb 文件:

def cohort
  students = Student.where(cohort_id: Cohort.find_by(name: params[:choice]).id)
  response = []
  students.each do |student|
    response.push({
      id:         student.id,
      first_name: student.first_name,
      last_name:  student.last_name
    })
  end
  render json: response
end

队列是我将原始 JSON 请求发送到

的地方
var $cohortChoice = $('.cohort-choice');
$cohortChoice.on('change', function(){

  var choice = $cohortChoice.val().trim();
  console.log(choice);

  $.ajax({
    method: "GET",
    dataType: "json",
    url: "/instructors/dash/cohort",
    data: { choice: choice},
    success: function(response, status, xhr){
      $dashCohort = $('.dash').children().first()
      $dashCohort.text("Cohort: "+choice)
      var $studentList = $('.scroll-down').eq(0)
      $studentList.empty()
      response.forEach(function(student) {
        $studentList.append('<a href="/students/'+student.id+'">'+ student.first_name + ' ' + student.last_name + '</a>')
      });
    },
    error: function(xhr, status, error){
      console.log(xhr, status, error)
    },
  })
});

这告诉我 InstructorsController 中有一个 NoMethodError,说 .id 对 nil 不起作用。我怀疑它没有提取 params[:choice]

首先,我不建议将数据库逻辑嵌入特定于视图的文件中。该工作负载属于控制器。

要实现你需要的 AJAX 调用,你需要在你的控制器中有这样的东西(在这种情况下,我假设你的 Students 控制器是最合乎逻辑的地方):

def fetch_students
  students = Student.where(cohort_id: Cohort.find_by(name: params[:choice]).id)
  response = []

  students.each do |student|
    response.push({
      id:         student.id,
      first_name: student.first_name,
      last_name:  student.last_name
    })
  end

  render json: response
end

然后您可以在 .js.erb 文件中调用它,如下所示:

$.ajax({
  url: "<%= fetch_students_students_index_path %>",
  type: 'GET',
  data: { choice: choice },
  success: function(response, status, xhr) {
    response.forEach(function(student) {
      $studentList.append('<a href="/students/' + student.id + '">' + student.first_name + ' ' + student.last_name + '</a>')
    });
  },
  error: function(xhr, status, error) {
    console.log(xhr, status, error);
  },
});

不要忘记在路由器中创建 fetch_students 端点。