嵌入ActiveRecord查询,.each阻止进入AJAX请求

时间:2015-12-19 16:01:33

标签: jquery ruby-on-rails ajax activerecord erb

我试图在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请求当前能够更改仪表板中标题的文本值,并且能够清空加载时预先填充的学生列表的内容,但包括这三行会产生错误:意外的标记%。

我正在使用.js.erb文件中的assets文件夹,以及scriptlets&amp;表达式似乎适用于我研究过的主题。

我错过了什么?是否有其他方法我应该尝试加载它?

由于

编辑:

所以我的教练控制器(这是教师可以使用的仪表板)和dash.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上工作。我的怀疑是它没有拔出参数[:choice]

1 个答案:

答案 0 :(得分:2)

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

要实现您作为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端点。