繁体   English   中英

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

[英]Creating RoR Links within Ajax call in .js.erb file

我有以下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 = att[i].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方法中“注入” 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

而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM