在Ajax中创建RoR链接调用.js.erb文件

时间:2016-03-15 21:30:56

标签: javascript jquery ruby-on-rails ruby ajax

我在按钮点击时激活了以下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代码。这是可能的,如果是的话,我该怎么做?

1 个答案:

答案 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

就是这样。