我正在使用以下代码在rails 3中设置AJAX操作。代码的AJAX部分似乎有效,但它不会请求正确的文件,而我的respond_to也会为常规HTML提供服务。
路由信息:
resources :zones do
resources :records
end
控制器:
def new
@zone = Zone.new
respond_to do |format|
format.html
format.js
end
end
视图中的链接(haml):
= link_to 'Add a zone →', new_zone_path, :remote=>true
从link_to生成HTML(还注意到html实体的渲染失败......但这是另一个问题):
<a href="/zones/new" data-remote="true">Add a zone &#8594;</a>
对于踢,视图/区域的目录列表。我不确定我这样做是对的, 所以我有new.js.rjs和new.rjs。它们都具有相同的内容,但从未被动作拾取。
| `~zones/
| |-_form.html.haml
| |-_record.html.haml
| |-edit.html.haml
| |-index.html.haml
| |-new.html.haml
| |-new.js.rjs
| |-new.rjs
| `-show.html.haml
最后,服务器从我点击链接时开始记录:
Started GET "/zones/new" for 127.0.0.1 at Wed Dec 29 00:04:03 -0700 2010
Processing by ZonesController#new as */*
User Load (0.4ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
Rendered zones/_form.html.haml (22.1ms)
Rendered zones/new.html.haml within layouts/application (34.9ms)
Completed 200 OK in 80ms (Views: 42.0ms | ActiveRecord: 0.4ms)
如您所见,它正在呈现请求的.html文件。现在,为了进行测试,我直接点击了页面http://localhost:3000/zones/new.js。它提供了new.js.rjs。此外,JavaScript远程调用正在运行。 Firebug显示请求和响应,但它请求错误的页面。
另外,为了测试,我做了这个:
= link_to "Add a zone", '/zones/new.js', :remote=>true
对于javascript,它运行正常(rjs已下载并执行并且正常工作),但它对于禁用javascript的系统没有很好的故障转移。
值得我使用jquery。
我觉得我在路由或链接语法中遗漏了一些内容,但我在网上和文档中找到的所有示例似乎都显示了我正在做的事情。抓到了什么?
感谢。
答案 0 :(得分:6)
您需要明确告诉Rails您需要js
格式:
= link_to 'Add a zone →', new_zone_path(:format => :js), :remote=>true
作为解释的一种方式:你必须指定.js扩展名,因为Rails没有区别对待。在许多情况下,您可能希望使用Ajax获取html或json - 而不仅仅是javascript。 Rails将允许您以任何格式获取任何内容,这就是您必须指定它的原因。
答案 1 :(得分:6)
使用此语法(包括data-type
声明)
= link_to 'Add a zone →', new_zone_path, remote: true, "data-type" => "script"
如果您只有.js.erb
个文件,没有要呈现的.html
文件,则无需分配data-type
请求(Rails会自动检测JS只能响应的方式)< / p>
要点 ,您必须确保 您的请求被视为以JS 执行 >。这意味着您在控制台中的请求应如下所示:
Started ...
Processing by ABCController#method as JS