当我尝试删除/销毁模型中的记录时,我正在遵循教程并遇到恼人的问题。摧毁行动似乎导致了表演行动。网上有很多信息表明它是一个javascript问题但是application.js已经包含// = require jquery_ujs和// = require jquery。
(http://guides.rubyonrails.org/getting_started.html)
index.html.erb
<h1>Hello, Rails!</h1>
<%= link_to 'My Blog', controller: 'articles' %>
<h1>Listing articles</h1>
<%= link_to 'New article', new_article_path %>
<table>
<tr>
<th>Title</th>
<th>Text</th>
<th>Genre</th>
<th>Ratings</th>
<th colspan="3"></th>
</tr>
<% @articles.each do |article| %>
<tr>
<td><%= article.title %></td>
<td><%= article.text %></td>
<td><%= article.genre %></td>
<td><%= article.ratings %></td>
<td><%= link_to 'Show', article_path(article) %></td>
<td><%= link_to 'Edit', edit_article_path(article) %></td>
<td><%= link_to 'Destroy', article_path(article),
method: :delete,
data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<%= link_to 'Back', articles_path %>
articles_controller.rb
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
def show
@article = Article.find(params[:id])
end
def new
@article = Article.new
end
def edit
@article = Article.find(params[:id])
end
def create
@article = Article.new(article_params)
if
@article.save
redirect_to @article
else
render 'new'
end
end
def update
@article = Article.find(params[:id])
if @article.update(article_params)
redirect_to @article
else
render 'edit'
end
end
def destroy
@article = Article.find(params[:id])
@article.destroy
end
private
def article_params
params.require(:article).permit(:title, :text, :genre, :ratings)
end
end
application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>Blog</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag :default, 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<%= yield %>
</body>
</html>
答案 0 :(得分:3)
之前有这个问题......
-
这主要是因为您的应用程序/布局中没有包含JQuery UJS。
Rails通过指定一些JS来使delete
方法工作,只要您点击它就可以从GET
to DELETE
更改请求。
destroy
链接不起作用的主要原因(您的路由是show
,这基本上意味着它使用GET
而不是DELETE
})是因为Rails没有正确翻译你的method
:
#app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
#app/views/layouts/application.html.erb
<%= javascript_include_tag "application" %>
一些提示:
#app/views/articles/index.html.erb
<%= content_tag :h1, "Hello, Rails!" %>
<%= link_to 'My Blog', articles_path %>
<%= content_tag :h1, "Listing articles" %>
<%= link_to 'New article', new_article_path %>
<% attrs = %i(title text genre ratings) %>
<%= content_tag :table do %>
<%= content_tag :tr do %>
<% attrs.each do |attr| %>
<%= content_tag :th, attr.to_s.titleize %>
<% end %>
<%= content_tag :th, " ", colspan: 3 %>
<% end %>
<% end %>
<% @articles.each do |article| %>
<%= content_tag :tr do %>
<% attrs.each do |attr| %>
<%= content_tag :td, article.send(attr) %>
<% end %>
<% end %>
<%= content_tag :td, link_to('Show', article) %>
<%= content_tag :td, link_to('Edit', edit_article_path(article)) %>
<%= content_tag :td, link_to('Destroy', article, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>
<% end %>
<%= link_to 'Back', articles_path %>
您根本不必使用content_tag
,我发现使用它比使用vanilla HTML更好(确保支持将来的任何代码)。
另外,尽可能使用loops
。很多人不必要地重复代码:
<td><%= @article.title %></td>
<td><%= @article.text %></td>
<td><%= @article.date %></td>
<td><%= @article.news %></td>
...
<% attrs = %i(title text date news) %>
<% attrs.each do |a| %>
<td><%= @article.send a %></td>
<% end %>