我在按钮点击时激活了以下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。我想使用他们的show
为该与会者id
页面创建链接,而不仅仅是显示每位与会者的姓名。理想情况下,我会创建一个变量full_name = att[i].first_name + " " att[i].last_name
,然后创建一个像
<%#= link_to full_name, user_path(user.id) %>
我知道这涉及获取json或javascript变量并在Ruby代码中使用它们,然后输出Ruby代码。这是可能的,如果是的话,我该怎么做?
答案 0 :(得分:2)
使用简单的AJAX请求进行此操作的方式是不可能的(按设计)。问题是Ruby代码首先呈现(因为它是服务器端),JavaScript呈现在它之后。所以你不能真正在Ruby方法中“注入”json,因为帮助器link_to
将在甚至从服务器请求JavaScript之前执行。
您希望拥有它的是使用不显眼的JavaScript(UJ)。这是通过将:remote => true
放在您的链接上来完成的。执行此操作后,请求将转到链接中的服务器端方法(attendees
)。在服务器端,您需要有一个respond_to
块:
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
就是这样。