2011-05-13 64 views
0

我想让我的AJAX调用与rails 3工作,但我很希望困惑。 我有一个索引页,其中列出了一个小表中的所有对象,并在其后面有一个详细链接。该HAML页面看起来是这样的:AJAX调用不工作在rails 3中

%h1 
    Step 1: Create/upload your CV 
#europasslogo 
%table.index 
    %tr 
    %th.bottom_border= 'CV ID' 
    %th.bottom_border= 'CV Title' 
    %th.bottom_border= 'Links' 
    - @cvs.each do |cv| 
    %tr 
     %td.cell= cv.id 
     %td.cell= cv.name 
     %td.cell 
     = link_to 'Matching', match_resume_url(cv.id) 
       
     = link_to "Details", cv_path(cv.id), {:remote => true, :method => :get} 
.clear 
#details 

它,当用户点击“详细信息”链接,响应需要的想法在底部的#details DIV来显示。这是非常基本的,因为我只想在该div中输出一个CV作为纯文本。

在我的控制器中我已经创建了以下内容:

class CvsController < ApplicationController 
    def new 
    @cvs = Cv.all 
    end 

    def show 
    cv = Cv.find params[:id] 
    @data = IO.readlines("public/cvs/#{cv.id}.xml", "").to_s 
    render :layout => false 
    end 

    def match 
    @cv = Cv.find params[:id] 
    @language = Language.find_or_create_by_code :en 
    @vacancies = Vacancy.joins(:vacancy_occupations).where('vacancy_occupations.concept_id' => @cv.occupations.collect{|o| o.id}).uniq 
    end 
end 

获取的简历和读取匹配的文件。迄今为止没有特别的。 当我打开网页,我点击链接,我看到了AJAX请求击中服务器,像这样:

Started GET "/cvs/2" for 192.168.33.82 at Fri May 13 00:55:49 -0700 2011 
    Processing by CvsController#show as JS 
    Parameters: {"id"=>"2"} 
    Cv Load (0.1ms) SELECT `cvs`.* FROM `cvs` WHERE `cvs`.`id` = 2 LIMIT 1 
Rendered cvs/show.js.haml (2.1ms) 
Completed 200 OK in 69ms (Views: 4.3ms | ActiveRecord: 0.1ms) 

所以我知道AJAX调用由服务器接收并产生响应。使用Firebug,我可以看到服务器在控制台中的响应:

$('details').html(&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; 
&lt;?xml-stylesheet href=&quot;http://europass.cedefop.europa.eu/xml/cv_en_GB.xsl&quot; type=&quot;text/xsl&quot;?&gt; 
&lt;europass:learnerinfo xsi:schemaLocation=&quot;http://europass.cedefop.europa.eu/Europass/V2.0 http://europass.cedefop.europa.eu/xml/EuropassSchema_V2.0.xsd&quot; xmlns:europass=&quot;http://europass.cedefop.europa.eu/Europass/V2.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; locale=&quot;en_GB&quot;&gt; 
    &lt;docinfo&gt; 
     &lt;issuedate&gt;2011-05-05T11:31:55+02:00&lt;/issuedate&gt; 
     &lt;xsdversion&gt;V2.0&lt;/xsdversion&gt; 
     &lt;comment&gt;Automatically generated Europass CV&lt;/comment&gt;&lt;/docinfo&gt; 
    &lt;prefs&gt; 
     &lt;field name=&quot;step1.firstName&quot; before=&quot;step1.lastName&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.addressInfo&quot; keep=&quot;true&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.telephone&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.mobile&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.fax&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.email&quot; keep=&quot;true&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.nationality&quot; keep=&quot;true&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.birthDate&quot; keep=&quot;true&quot; format=&quot;/numeric/long&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.gender&quot; keep=&quot;true&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.photo&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step1.application.label&quot; keep=&quot;true&quot;&gt;&lt;/field&gt; 
     &lt;field format=&quot;/numeric/long&quot; name=&quot;step3List[0].period&quot;&gt;&lt;/field&gt; 

     &lt;field name=&quot;step3List&quot; keep=&quot;true&quot; before=&quot;step4List&quot;&gt;&lt;/field&gt; 
     &lt;field keep=&quot;false&quot; name=&quot;step3List[0].company.sector.label&quot;&gt;&lt;/field&gt; 
     &lt;field keep=&quot;false&quot; name=&quot;step3List[0].company.addressInfo&quot;&gt;&lt;/field&gt; 
     &lt;field keep=&quot;false&quot; name=&quot;step3List[0].company.name&quot;&gt;&lt;/field&gt; 
     &lt;field keep=&quot;true&quot; name=&quot;step3List[0].activities&quot;&gt;&lt;/field&gt; 
     &lt;field keep=&quot;true&quot; name=&quot;step3List[0].position.label&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step4List&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step5.motherLanguages&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step5.foreignLanguageList&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step6.socialSkills&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step6.organisationalSkills&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step6.technicalSkills&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step6.computerSkills&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step6.artisticSkills&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step6.otherSkills&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step6.drivingLicences&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step7.additionalInfo&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;step7.annexes&quot; keep=&quot;false&quot;&gt;&lt;/field&gt; 
     &lt;field name=&quot;grid&quot; keep=&quot;false&quot;&gt;&lt;/field&gt;&lt;/prefs&gt; 
    &lt;identification&gt; 
     &lt;firstname&gt;Wouter&lt;/firstname&gt; 
     &lt;lastname&gt;ESCOmatch&lt;/lastname&gt; 
     &lt;contactinfo&gt; 
      &lt;address&gt; 
       &lt;addressLine&gt;Haachtstesteenweg&lt;/addressLine&gt; 
       &lt;municipality&gt;Kampenhout&lt;/municipality&gt; 
       &lt;postalCode&gt;1910&lt;/postalCode&gt; 
       &lt;country&gt; 
        &lt;label&gt;BElgium&lt;/label&gt;&lt;/country&gt;&lt;/address&gt; 
      &lt;telephone&gt;&lt;/telephone&gt; 
      &lt;fax&gt;&lt;/fax&gt; 
      &lt;mobile&gt;&lt;/mobile&gt; 
      &lt;email&gt;[email protected]&lt;/email&gt;&lt;/contactinfo&gt; 
     &lt;demographics&gt; 
      &lt;birthdate&gt;1975-01-26&lt;/birthdate&gt; 
      &lt;gender&gt;M&lt;/gender&gt; 
      &lt;nationality&gt; 
       &lt;label&gt;belgium&lt;/label&gt;&lt;/nationality&gt;&lt;/demographics&gt;&lt;/identification&gt; 
    &lt;application&gt; 
     &lt;code&gt;71110&lt;/code&gt; 
     &lt;label&gt;Miner&lt;/label&gt;&lt;/application&gt; 
    &lt;workexperiencelist&gt; 
     &lt;workexperience&gt; 
      &lt;period&gt; 
       &lt;from&gt; 
        &lt;year&gt;2000&lt;/year&gt; 
        &lt;month&gt;--02&lt;/month&gt; 
        &lt;day&gt;---02&lt;/day&gt; 
       &lt;/from&gt; 
       &lt;to&gt; 
        &lt;year&gt;2004&lt;/year&gt; 
        &lt;month&gt;--02&lt;/month&gt; 
        &lt;day&gt;---02&lt;/day&gt; 
       &lt;/to&gt; 
      &lt;/period&gt; 
      &lt;position&gt; 
       &lt;code&gt;82121&lt;/code&gt; 
       &lt;label&gt;Quartermaster staff, military&lt;/label&gt; 
      &lt;/position&gt; 
      &lt;activities&gt; 
       process control 
       diving 
       military 
      &lt;/activities&gt; 
      &lt;employer&gt; 
       &lt;name&gt;&lt;/name&gt; 
       &lt;address&gt; 
        &lt;addressLine&gt;&lt;/addressLine&gt; 
        &lt;municipality&gt;&lt;/municipality&gt; 
        &lt;postalCode&gt;&lt;/postalCode&gt; 
        &lt;country&gt; 
         &lt;label&gt;&lt;/label&gt; 
        &lt;/country&gt; 
       &lt;/address&gt; 
       &lt;sector&gt; 
        &lt;label&gt;&lt;/label&gt; 
       &lt;/sector&gt; 
      &lt;/employer&gt; 
     &lt;/workexperience&gt; 
    &lt;/workexperiencelist&gt; 
    &lt;languagelist&gt; 
     &lt;language xsi:type=&quot;europass:mother&quot;&gt; 
      &lt;label&gt;   &lt;/label&gt;&lt;/language&gt;&lt;/languagelist&gt; 
    &lt;skilllist&gt; 
     &lt;skill type=&quot;social&quot;&gt;&lt;/skill&gt; 
     &lt;skill type=&quot;organisational&quot;&gt;&lt;/skill&gt; 
     &lt;skill type=&quot;technical&quot;&gt;&lt;/skill&gt; 
     &lt;skill type=&quot;computer&quot;&gt;&lt;/skill&gt; 
     &lt;skill type=&quot;artistic&quot;&gt;&lt;/skill&gt; 
     &lt;skill type=&quot;other&quot;&gt;&lt;/skill&gt; 
     &lt;structured-skill xsi:type=&quot;europass:driving&quot;&gt;&lt;/structured-skill&gt;&lt;/skilllist&gt; 
    &lt;misclist&gt; 
     &lt;misc type=&quot;additional&quot;&gt;&lt;/misc&gt; 
     &lt;misc type=&quot;annexes&quot;&gt;&lt;/misc&gt;&lt;/misclist&gt;&lt;/europass:learnerinfo&gt;); 

对不起,但文件相当大。所以我看到很多Javascript beeing生成。 show.js.haml文件如下所示:

= "$('details').html(#{@data});" 

我做错了什么?我不是很擅长这个JavaScript的东西,但我所问的不是那么难吗? 所有我想要的是,当我点击链接时,@data变量中的所有内容都放置在我的详细信息div中...

回答

0

感谢所有的反馈人员,但我设法得到它在我的一个朋友的帮助下排序。

在控制器我有以下代码:

此加载所有我所需要的数据并呈现的局部视图。该命令的其余部分执行我需要的魔法,并触发JavaScript更新事物。我个人觉得这种方法很容易理解。

1

= "$('details').html(#{@data});"代码在HAML中被转义。

使用!= "$('details').html(#{@data});"然后代码应该执行并替换内容。

但是我不确定'details'是否是正确的选择器。据我所知,如果它是一个ID,你应该使用'#details'。

+0

没有这样的函数.to_html。而且响应如何格式化并不重要。我只是想得到什么是返回可见我的div元素 – 2011-05-13 08:16:53

+0

什么是'细节'?它是一个类还是一个id?它似乎是错误的选择。如果'details'是一个id,那么尝试$('#details')如果它是一个类,请尝试$('。details')。我没有进入HAML,但你应该可以添加一个id为':id =>'details' – 2011-05-13 08:21:50

+0

这是一个ID。按照您在show.js.haml文件中所述更改它,但仍然没有任何内容 – 2011-05-13 08:24:00

1

我想你会发现,当你将JS从服务器端代码中分离出来,并且从来没有遇到过这样的麻烦时,你会发现更少的麻烦。您的控制器基本上只是读取文件并将其加载到页面上。我们能做到这一点完全JS:

CV链接

= link_to "Details", cv_path(cv.id), :'data-cv-id' => cv.id 

JS wireup

$('table.index').delegate('a[data-cv-id]', 'click', function (e) { 
    var id = $(e.target).data('cv-id'); 
    $.ajax({ 
    type: 'GET', 
    url: '/cv/' + id + '.xml', 
    dataType: 'xml', 
    success: function (xml) { 
     $('#detail').html(xml); 
    } 
    }); 
    e.preventDefault(); 
}); 

(无耻的插头)我jquery plugin可以更轻松地进行:

$('table.index').delegate('a[data-cv-id]', 'click', function (e) { 
    $.read('/cv/{id}.xml', { id: $(e.target).data('cv-id') }) 
    .then(function (xml) { 
    $('#details').html(xml); 
    }); 
    e.preventDefault(); 
}); 

JS接线 - 原型

下面是使用Prototype的示例。js

var table = $$('table.index')[0]; 
$(table).on('a[data-cv-id]', 'click', function (event, element) { 
    new Ajax.Request('/cv/' + event.getAttribute('data-cv-id') + '.xml', { 
    method: 'get', 
    onSuccess: function (transport) { 
     //do something with transport.responseXML 
     //not sure how to write Prototype code for this bit 
    } 
    }); 
    Event.stop(event); 
}); 

您可以更进一步,将请求/提示问题与amplify.request分开。另外看看JS模板系统,如Handlebars

我知道它很容易将Rails模板与Javascript结合起来...但是根据我的经验,这真的没有什么用处。将控制器编写为JSON/XML服务API并在Javascript中执行请求/模板化的数据会更容易。

RJS从Rails中移除的原因是:当您在服务器端代码和前端代码之间创建这些不必要的连接时,会让您的应用程序变得更脆弱并且难以维护。您的控制器不应该依赖于您的模板中的标记。

+0

原始文章看起来像jQuery,但现在看起来它可能是Prototype/RJS。我的代码是在jQuery中。 – 2011-05-13 09:07:39

+0

原来是原型是。对不起,没有提到这一点 – 2011-05-15 08:04:05