我有以下 ajax 调用,该调用在单击按钮时激活:
$.ajax({
url: button_action,
data: {},
type: "POST",
dataType: "json",
success: function( data ) {
var att = data.attendees
var attendee_list = "";
for (i = 0; i < data.attendees.length; i++) {
if ( i != att.length-1) {
attendee_list += att[i].first_name + " " + att[i].last_name + ", ";
} else {
attendee_list += att[i].first_name + " " + att[i].last_name
}
}
att_array.innerHTML = attendee_list;
}, . . .
});
现在,我们看到我正在 data.attendees
中从服务器返回事件参加者列表。我可以获取每个与会者的名字和姓氏,并且可以使用 id = att[i].id
轻松获取与会者的 ID。我不想只显示每个与会者的姓名,而是想使用他们的 id
创建一个指向该与会者 show
页面的链接。理想情况下,我会创建一个变量 full_name = att[i].first_name + ""att[i].last_name
,然后创建一个链接,例如
<%#= link_to full_name, user_path(user.id) %>
我知道这涉及获取 json 或 javascript 变量并在 Ruby 代码中使用它们,然后输出 Ruby 代码。这可能吗?如果可以,我该怎么做?
最佳答案
您使用简单的 AJAX 请求的方式是不可能的(根据设计)。问题是 Ruby 代码首先渲染(因为它是服务器端),而 JavaScript 在其之后渲染。因此,您无法真正在 Ruby 方法中“注入(inject)”json,因为助手 link_to
将在从服务器请求 JavaScript 之前执行。
您希望使用不显眼的 JavaScript (UJ)。这是通过在链接上添加 :remote => true
来完成的。执行此操作后,请求将转到链接中放入的服务器端方法 (attendees
)。服务器端,您需要有一个 respond_to
block :
def attendees
@attendees = Attendee.all #I'm making this up for the example
respond_to do |format|
format.js
end
end
然后,您需要一个以操作命名的 .js.erb
文件,即 attendees.js.erb
。当服务器端执行时它将被调用。您将收到一系列元素。您需要一个能够迭代它们的部分。以下是您将如何做到这一点。在attendees.js.erb
('.attendee-list-container').html("<%= j render(:partial => 'attendees_list', :locals => { :attendees => @attendees }) %>");
最后,在您的 _attendees_list.html.erb
中,您可以迭代并创建链接。
#in HAML:
-attendees.each do |attendee|
=link_to "#{attendee.first_name + ' ' + attendee_last_name}" , attendee
就是这样。
关于javascript - 在 .js.erb 文件中的 Ajax 调用中创建 RoR 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022562/