【问题标题】:Rails 3 Link_to :remote is not triggering RJSRails 3 Link_to:远程未触发 RJS
【发布时间】:2011-06-01 02:44:30
【问题描述】:

我正在使用以下代码在 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 &amp;#8594;</a> 

对于 kicks,视图/区域的目录列表。我不确定我这样做是否正确, 所以我有 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 的价值。

我觉得我在路由或链接语法中遗漏了一些东西,但我可以在网上和文档中找到的所有示例似乎都准确地显示了我在做什么。有什么问题?

谢谢。

【问题讨论】:

    标签: ruby-on-rails-3 rjs link-to-remote


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白了。这对非 JavaScript 浏览器有何影响?
    • 它没有。如果您担心非 JavaScript 浏览器,您可以随时检查控制器中的请求(通过request.xhr?)并以这种方式处理回退。
    • 这就是我想要的。谢谢。
    • 我遇到了和voxosbscuro一样的问题,但是使用Rails 4.format=> js似乎不是4中的解决方案。我得到了未知的格式错误,所以我的格式。 js 无法识别,但 format.html 可以。我需要救生员..
    【解决方案2】:

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

    = link_to 'Add a zone &#8594;', new_zone_path, remote: true, "data-type" => "script"
    

    如果您只有 .js.erb 文件,没有要呈现的 .html 文件,则无需分配请求的 data-type(Rails 会自动检测 JS 唯一的响应方式)

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

    Started ...
    Processing by ABCController#method as JS
    

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多