嵌入 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
端点。
我正在尝试在 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
端点。