【问题标题】:Delete Method Doesn't Work in Rails删除方法在 Rails 中不起作用
【发布时间】:2012-09-18 08:34:17
【问题描述】:

我当前的代码如下所示:

 <%= javascript_include_tag "hchq.js", "bootstrap-image-gallery.js", "bootstrap-image-gallery.min.js", "load-image.min.js", "media.js", "jquery", "bootstrap.js", "jquery.dataTables.js", "DT_bootstrap.js" %>
  <%= javascript_include_tag :defaults %>

但是,我不断得到:

ActionController::RoutingError (No route matches [GET] "/assets/defaults.js"):
  actionpack (3.2.8) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.8) lib/rails/rack/logger.rb:26:in `call_app'
  railties (3.2.8) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.1) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.8) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.1) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/static.rb:62:in `call'
  railties (3.2.8) lib/rails/engine.rb:479:in `call'
  railties (3.2.8) lib/rails/application.rb:223:in `call'
  rack (1.4.1) lib/rack/content_length.rb:14:in `call'
  railties (3.2.8) lib/rails/rack/log_tailer.rb:17:in `call'
  rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service'
  /usr/local/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  /usr/local/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  /usr/local/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

深入研究我发现的问题:Rails 3.1rc4 defaults.js not found 建议我去掉默认值。我把它拿出来,404 消失了,但是随着它的进出,我无法发出删除请求。它只是将我引导到显示页面。

知道发生了什么以及如何解决这个问题,这样我就不会收到 404 并且可以发出删除请求吗?

更新:

这是实际的删除链接:&lt;%= link_to 'Delete', client_path(client), method: "delete", class: "label label-important" %&gt;,它会生成以下 html:&lt;a href="/clients/2" class="label label-important" data-method="delete" rel="nofollow"&gt;Delete&lt;/a&gt;,这对我来说似乎是正确的。

这是日志中的一行:

Started GET "/clients/2" for 127.0.0.1 at 2012-09-27 16:50:23 -0500
Processing by ClientsController#show as HTML
  Parameters: {"id"=>"2"}
  Client Load (0.3ms)  SELECT "clients".* FROM "clients" WHERE "clients"."id" = ? LIMIT 1  [["id", "2"]]
  Rendered clients/show.html.erb within layouts/application (1.2ms)
Completed 200 OK in 47ms (Views: 45.4ms | ActiveRecord: 0.3ms)


Started GET "/assets/defaults.js" for 127.0.0.1 at 2012-09-27 16:50:23 -0500
Served asset /defaults.js - 404 Not Found (4ms)

我尝试的另一件事是摆脱默认行,因为它是 pre-rails 3.1,并使用“应用程序”作为 javascript_include_tag 中唯一的东西,我仍然有这个问题。

【问题讨论】:

  • 如果您将&lt;%= javascript_include_tag :defaults %&gt; 移到另一个javascript_include_tag 上方会发生什么?
  • @ScottJShea 那没有任何区别。
  • 尝试使用符号,而不是字符串。
  • @MurifoX 那行不通。它仍然只是重定向到显示页面。
  • 您的routes.rb 中有resources :clients 吗?

标签: jquery ruby-on-rails ruby-on-rails-3 actioncontroller


【解决方案1】:

唯一合理的解释与 CRSF 令牌有关 Rails 表单在有非 GET 操作到达服务器时所期望的。在 Rails 中构建表单时,出于安全目的,您有一个传递给服务器的令牌。当您使用 form_forform_tag 助手(表单使用 POSTS 和其他东西)时,这是自动内置的。

由于protect_from_forgery 在您的application_controller 中,rails 不允许您从表单外部执行 POST/DELETE/PUT,这就是 link_to 不起作用的原因,它只是一个链接,正在尝试做一个POST。但是,如果您对此行发表评论,则该链接将正常工作。

更多信息在这里:http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf

【讨论】:

    【解决方案2】:

    将 Link_to 更改为 Button_to 修复它。

    为什么?

    【讨论】:

    • 我相信button_to 将链接包装在表单中。我现在会发布一个最详细的答案。
    【解决方案3】:

    您的删除链接只是一个链接,js 魔术将其转换为然后发布的表单。这就是表单有效而链接无效的原因 - 它一定只是保持链接。

    至于为什么delete链接不起作用,是你缺少js文件(因此是404),或者如果你的js包含正确,则js中有错误,链接将由帮助器转换。在浏览器中检查您的 js 控制台并查找错误。

    您的链接将您发送到获取请求,因此显然内置的 rails js 无法转换链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 2022-09-24
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      相关资源
      最近更新 更多