我得到"无法找到ArticleController"在我的删除页面上按"删除它"后。我觉得它找不到破坏功能!这里缺少什么?
控制器:
class ArticleController < ApplicationController
def index
@article= Article.all
end
def show
@article= Article.find(params[:id])
end
def new
@article= Article.new
end
def create
@article= Article.new(user)
if @article.save
redirect_to(:action => 'index')
else
redirect_to(:action => 'index')
end
end
def delete
@article= Article.find(params[:id])
end
def destroy
article.find(params[:id]).destroy
redirect_to(:action => 'index')
end
private
def user
params.require(:article).permit(:title, :text)
end
end
routes.rb
Rails.application.routes.draw do
resources :article
match ':controller(/:action(/:id))', :via => [:get, :post]
#..
我的delete.html.erb
<h2>Delete</h2>
<%= form_for :article, :url => url_for(:action => 'destroy', :id => @article) do |f| %>
<%= @article.title %>
<%= submit_tag("Delete It") %>
<% end %>
答案 0 :(得分:4)
我发现您发布的代码存在一些问题。
首先,您的控制器应该是资源的复数名称,所以在这种情况下它应该是ArticlesController
。
其次,关于您获得的错误,在路由文件中使用resources :articles
时,destroy操作会映射到DELETE
请求。您的表单正在尝试GET
销毁行动。
你想要做的是解决这个问题
<%= form_for :article, :url => url_for(:action => 'destroy', :id => @article), :method => :delete do |f| %>
有关Rails如何使用REST的更多信息,请查看Rails Routing Guide。
答案 1 :(得分:1)
首先,您的destroy
方法无效,无需从控制器移除。
将您的delete
方法更改为
def delete
@article= Article.find(params[:id])
if @article.destroy
redirect_to(:action => 'index')
else
render 'delete'
end
最后,将form_for
更改为
<%= form_for :article, :url => url_for(:action => 'delete', :id => @article) do |f| %>
<%= @article.title %>
<%= submit_tag("Delete It") %>
<% end %>
注意:并且正如@brendon所提到的,将您的控制器名称更改为复数。目前它是单数,这是针对Rails的命名约定。
答案 2 :(得分:1)
将delete.html.erb中的代码更改为
<h2>Delete</h2>
<%= @article.title %> <%= button_to 'Delete It', article, method: :delete %>