【问题标题】:How to delete / destroy a record in rails?如何删除/销毁rails中的记录?
【发布时间】:2015-06-01 13:34:15
【问题描述】:

我正在基于 railsguide 构建一个 rails 应用程序

 http://guides.rubyonrails.org/getting_started.html

它在erb中要求的语法是……

<td><%= link_to 'Destroy', article_path(article),
          method: :delete,
          data: { confirm: 'Are you sure?' } %></td>

由于某种原因,这读作

https://localhost:3000/articles/[#]

其中 # 是要删除的给定记录。换句话说,我想删除一条记录,它会将我的代码解释为显示该记录。

我做错了什么?

更多信息

这是动态生成的

<td>
  <a rel="nofollow" data-method="delete" href="/articles/2">Destroy</a>
</td>

application.html.erb 有以下...

 <%= javascript_include_tag 'default', 'data-turbolinks-track' => true %>
 <%= csrf_meta_tags %>

控制器定义

def destroy
@article= Article.find(params[:id])
@article.destroy

redirect_to articles_path
end

与在 application.html.erb 中使用“应用程序”相关的错误

ExecJS::ProgramError in Welcome#index

Showing E:/scabase/app/views/layouts/application.html.erb where line #6     raised:

TypeError: Object doesn't support this property or method
(in C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/turbolinks-  2.5.3/lib/assets/javascripts/turbolinks.js.coffee)

【问题讨论】:

  • 您的代码看起来不错。它应该向https://localhost:3000/articles/:id 发送一个DELETE HTTP 请求。单击链接时是否出现错误?我们需要更多信息来帮助调试。
  • 感谢您提供更多信息——当您单击链接时,我仍然对实际发生的情况感到有些困惑?您是否被带回您之前所在的页面,或者您是否收到错误消息?您还可以在rails server 运行的终端中查看日志,看看是否可以找到请求被路由到ArticlesController 的destroy 方法的位置。

标签: ruby-on-rails ruby


【解决方案1】:

这是完全正常的。在 REST 世界中,请求使用动词(GET、DELETE 等)和标识资源的 URI 的组合。如果你对同一个资源(即同一篇文章)做不同的事情,那么只有动词会改变。对象的显示页面使用 GET,更新操作使用 PATCH(Rails 4.1 之前的 PUT),销毁记录使用 DELETE

在实践中,链接总是会产生 GET 请求,甚至表单也只允许 GET 或 POST,因此 rails 会模拟其余方法 - 单击具有 data-method=destroy 属性的链接会创建一个表单,该表单会使用隐藏的 @987654323 发布到 URL @ 输入值 DELETE。这是通过一些包含在新生成的 Rails 应用程序中的 javascript 完成的。

你有

<%= javascript_include_tag 'default', 'data-turbolinks-track' => true %>

并且您已经指出加载 default.js 时出错 - 我猜您正在遵循一套旧的说明,因为在现代应用程序中(自 rails 3.1 起)这应该是

<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>

您的 application.js 文件还应包含(除其他外)

//= require jquery
//= require jquery_ujs

(你也可以使用原型或其他js库)

【讨论】:

  • 最初构建 Rails 时,我在 application.html.erb 中将 application 作为标记。这得出了主要问题中添加的错误。另一个 stackoverflow 建议切换到默认值,以解决问题
  • @TangibleDream 什么错误?如果您描述这一点(以及您所做的其他尝试),将对回答者有所帮助
  • 已添加,5 分钟前尝试添加,Stackoverflow 有一个维护横幅。
  • 这是一个与咖啡脚本相关的错误 - 如果您指的是stackoverflow.com/questions/28312460/…,那么页面下方会有更好的答案(我遇到了类似的错误,降级咖啡脚本源对我有用)
  • 做到了!谢谢弗雷德里克,赏金是你的。或者他们让我在 22 小时内给你。谢谢。
【解决方案2】:

很可能,Rails 默认的 javascripts 没有加载——特别是 jquery_ujs。这个 javascript 允许 Rails 解释不完全兼容浏览器的 DELETE 调用。

您加载的 javascript 名为“默认”。 Rails 标准是“应用程序”。检查资产/javascripts 中是否有“default.js”及其包含的内容。如果您想要 Rails 开箱即用的行为,只需转到:

<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
 <%= csrf_meta_tags %>

只要您没有更改 application.js 文件,这应该可以工作。

【讨论】:

  • 最初构建 Rails 时,我在 application.html.erb 中将 application 作为标记。这得出了主要问题中添加的错误。另一个 stackoverflow 建议切换到默认值,以解决问题 -
【解决方案3】:

您展示的代码将做两件事:

1) 它将创建一个 javascript 弹出窗口,询问“你确定吗?”。那必须在客户端上运行,而不是在服务器上。因此,Rails 会在您的浏览器中生成一个类似于 # 的“javascript”链接。

2) 如果您单击“是”,它将向您的服务器发送 HTTP DELETE。不幸的是,浏览器并不容易做到这一点。因此它会生成更多的 JavaScript 代码来执行此操作(AJAX)。

所以你看到的不是 Ruby/Rails,而是 Rails 为你生成的 Javascript 代码。

【讨论】:

  • 所以它说'这里我们以不同的方式使用link_to。我们将命名路由作为第二个参数传递,然后将选项作为另一个参数传递。 :method 和 :'data-confirm' 选项用作 HTML5 属性,因此当单击链接时,Rails 将首先向用户显示确认对话框,然后使用方法删除提交链接。这是通过 JavaScript 文件 jquery_ujs 完成的,当您生成应用程序时,该文件会自动包含在应用程序的布局 (app/views/layouts/application.html.erb) 中。没有这个文件,确认对话框就不会出现。'
  • 这不会使用 AJAX。在 link_to 方法上没有设置 remote: true 属性。就目前而言,它只会向服务器发送 HTTP DELETE 请求。然后它会在文章被删除后按照 ArticlesController#destroy 方法中的说明进行重定向。
  • 糟糕,对,我可能记错了 AJAX 位。
  • 我在浏览器控制台中看到未找到 default.js 的 404 文件
猜你喜欢
  • 2014-01-22
  • 2015-11-12
  • 2011-09-27
  • 2011-07-01
  • 2017-04-18
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2011-04-26
相关资源
最近更新 更多