【问题标题】:Unknown action, Ruby on Rails 4 Beginner, destroy action is unknown未知动作,Ruby on Rails 4 初学者,销毁动作未知
【发布时间】:2014-05-05 16:14:39
【问题描述】:

在我的删除页面上按“删除”后,我得到“找不到 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

路线.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 %>

【问题讨论】:

  • 我认为您不需要路线文件中的匹配行。资源创建 7 条宁静的路径

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


【解决方案1】:

我发现您发布的代码有一些问题。

首先,你的控制器应该是你的资源的复数名称,所以在这种情况下它应该是ArticlesController

其次,关于您遇到的错误,在您的路由文件中使用resources :articles 时,销毁操作将映射到DELETE 请求。您的表单正在尝试 GET 销毁操作。

你想要解决的问题是

<%= form_for :article, :url => url_for(:action => 'destroy', :id => @article), :method => :delete do |f| %>

查看Rails Routing Guide,了解有关 Rails 如何使用 REST 的更多信息。

【讨论】:

  • 谢谢,我确实更改了 delete.html,现在它可以工作了。我没有将控制器的名称改为复数,如果我保持单数呢?
  • @Zaeim 应该保持复数形式。检查 Rails 的命名约定。guides.rubyonrails.org/…
【解决方案2】:

首先,您的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 所提到的,将您的控制器名称更改为 plural。目前它是 singular,这与Rails 的命名约定。

【讨论】:

  • 他应该保留ArticlesController#destroy并删除ArticlesController#delete,因为后者不是Rails标准。
  • @BrandonCordell 你是对的。但是 OP 的销毁方法中的逻辑对我来说似乎是错误的。不是吗?
【解决方案3】:

将 delete.html.erb 中的代码更改为

<h2>Delete</h2>

<%= @article.title %> <%= button_to 'Delete It', article, method: :delete %>

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多