Rails 3 Link_to:remote不触发RJS

vox*_*uro 2 rjs link-to-remote ruby-on-rails-3

我正在使用以下代码在rails 3中设置AJAX操作.代码的AJAX部分似乎有效,但它没有请求正确的文件,我的respond_to为常规HTML提供服务.

路由信息:

resources :zones do
  resources :records
end
Run Code Online (Sandbox Code Playgroud)

控制器:

def new
  @zone = Zone.new
  respond_to do |format|
    format.html
    format.js
  end
end
Run Code Online (Sandbox Code Playgroud)

链接视图(haml):

= link_to 'Add a zone →', new_zone_path, :remote=>true
Run Code Online (Sandbox Code Playgroud)

从link_to生成的HTML(还注意到html实体的失败呈现......但这是另一个问题):

<a href="/zones/new" data-remote="true">Add a zone &amp;#8594;</a> 
Run Code Online (Sandbox Code Playgroud)

对于踢,视图/区域的目录列表.我不确定我这样做是否正确,所以我有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
Run Code Online (Sandbox Code Playgroud)

最后,从我点击链接时的服务器日志:

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)
Run Code Online (Sandbox Code Playgroud)

如您所见,它正在为请求呈现.html文件.现在,为了测试,我直接点击http:// localhost:3000/zones/new.js页面.它提供了new.js.rjs.此外,JavaScript远程调用正在运行.Firebug显示请求和响应,但它请求错误的页面.

也用于测试我这样做:

= link_to "Add a zone", '/zones/new.js', :remote=>true
Run Code Online (Sandbox Code Playgroud)

哪个工作正常(rjs下载并执行并正常工作)为javascript但它没有javascript禁用系统的良好故障转移.

为了什么值得我使用jquery.

我觉得我在路由或链接语法中遗漏了一些内容,但我在网上和文档中找到的所有示例似乎都显示了我正在做的事情.抓到了什么?

谢谢.

von*_*rad 6

你需要明确告诉Rails你想要的js格式:

= link_to 'Add a zone &#8594;', new_zone_path(:format => :js), :remote=>true
Run Code Online (Sandbox Code Playgroud)

作为一种解释:您必须指定.js扩展名,因为Rails没有区别对待.在许多情况下,您可能希望使用Ajax获取html或json - 而不仅仅是javascript.Rails将允许您以任何格式获取任何内容,这就是您必须指定它的原因.


Hoa*_* Le 6

这个语法也可以解决这个问题(包括data-type声明)

= link_to 'Add a zone &#8594;', new_zone_path, remote: true, "data-type" => "script"
Run Code Online (Sandbox Code Playgroud)

如果你只有.js.erb文件,没有.html要呈现的文件,则没有必要分配data-type请求(Rails自动检测JS只能响应)

要点这里是你必须确保你的要求被认为是JS将被执行.这意味着您在控制台中的请求应如下所示:

Started ...
Processing by ABCController#method as JS
Run Code Online (Sandbox Code Playgroud)