未知动作,Ruby on Rails 4初学者,破坏动作未知

时间:2014-05-05 16:14:39

标签: ruby-on-rails ruby ruby-on-rails-4 destroy

我得到"无法找到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 %>

3 个答案:

答案 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 %>