我试图在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]
答案 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
端点。