如何删除/销毁rails中的记录?

时间:2015-03-28 05:21:56

标签: ruby-on-rails ruby

我正在建立一个基于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

与使用&#39;应用程序&#39;相关的错误在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)

3 个答案:

答案 0 :(得分:2)

最有可能的是,没有加载Rails默认的javascripts - 特别是jquery_ujs。这个javascript允许Rails解释DELETE调用,这些调用并不完全符合浏览器。

您加载的javascript名为&#39;默认&#39;。 Rails标准是应用程序&#39;。检查您是否有&#39; default.js&#39;内部资产/ javascripts及其包含的内容。如果您希望Rails开箱即用,只需转到:

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

只要您没有更改application.js文件,这就应该有效。

答案 1 :(得分:1)

这是完全正常的。在REST世界中,请求使用动词(GET,DELETE等)和标识资源的URI的组合。如果您对同一资源(即同一篇文章)执行不同的操作,则只会更改动词。对象的显示页面使用GET,更新操作使用PATCH(在rails 4.1之前的PUT)并且销毁记录使用DELETE

在实践中,链接始终会产生GET请求,甚至表单只允许GET或POST,因此rails会模拟其余的方法 - 单击带有data-method=destroy属性的链接会创建一个表单,该表单会发布到带有隐藏的URL _method输入值为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库)

答案 2 :(得分:0)

您展示的代码将执行两项操作:

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

2)如果单击“是”,它将向您的服务器发送HTTP DELETE。不幸的是,浏览器不容易这样做。因此,它会生成更多的javascript代码(AJAX)。

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