路由错误没有路由匹配[POST]

时间:2016-04-08 18:37:08

标签: ruby-on-rails ruby

我开始学习Ruby on Rails,到目前为止一切进展顺利,但最终出现了一个我无法以任何方式解决的问题。当我编辑表单上的信息并单击以提供更新时,它会向我显示以下错误(抱歉我的英语,我的语言不流利):

Routing Error
No route matches [POST] "/grupos/14/edit"

Rails.root: C:/Ruby/Projetos/florarails

Application Trace | Framework Trace | Full Trace
Routes

outes match in priority from top to bottom

Helper         HTTP Verb        Path                  Controller#Action

grupos_path    GET        /grupos(.:format)           grupos#index 
               POST       /grupos(.:format)           grupos#create new_grupo_path  
               GET        /grupos/new(.:format)       grupos#new
edit_grupo_path 
               GET        /grupos/:id/edit(.:format)  grupos#edit
grupo_path  
               GET        /grupos/:id(.:format)       grupos#show
               PATCH      /grupos/:id(.:format)       grupos#update
               PUT        /grupos/:id(.:format)       grupos#update
               DELETE     /grupos/:id(.:format)       grupos#destroy

这是我的代码控制器:

class GruposController < ApplicationController
  def index
    @grupos = Grupo.all
  end

  def show
    @grupo = Grupo.find(params[:id])
  end

  def new
    @grupo = Grupo.new
  end

  def create
    @grupo = Grupo.new(user_params)
    if @grupo.save
        flash[:aviso] = 'Grupo salvo com sucesso'
    else
        flash[:erro] = 'Erro ao salvar grupo'
    end
    redirect_to (@grupo)
  end

  private

  def user_params
    params.require(:grupo).permit(:descricao)
  end

  def edit
    @grupo = Grupo.find(params[:id])
  end

  def update
    @grupo = Grupo.find(params[:id])
    if @grupo.update_attributes(params[:grupo])
        flash[:aviso] = 'Grupo salvo com sucesso'
    end
    redirect_to grupos_path
  end

  def destroy
    @grupo = Grupo.find(params[:id])
    @grupo.destroy
    flash[:info] = "Grupo excluido com sucesso"
    redirect_to(grupos_path)
  end
end

以下是我的观点代码:

<%= form_for :grupo do |f| %>
    <p>Edição de Grupos</p>
    <%= f.label :descricao, "Descrição:" %>:
    <%= f.text_field :descricao, :size => 40 %>
    <%= f.submit "Alterar Dados" %>
<% end %>

这是文件内容routes.rb:

Rails.application.routes.draw do 

    resources :grupos
    match 'grupos/:id', controller: 'grupos', action: 'show', via: 'get'
    match 'grupos/:id/edit', controller: 'grupos', action: 'edit', via: 'get'
    match 'grupos/:id/edit', controller: 'grupos', action: 'update', via: 'post' #(When this line is added another error is displayed on the screen >> "Unknown action The action 'update' could not be found for GruposController")

end

感谢您的关注。

2 个答案:

答案 0 :(得分:0)

首先,应该为对象创建保留POST个动作,而不是更新。使用PUTPATCH进行更新。

此外,您的控制器(editupdatedestroy)中的关键操作是private,这些操作应该是公开的,以便可路由。在上一节中,您的错误来源是哪一个。

简而言之,只需使用resources :groupos即可解决大多数问题。这将产生一致的路线:

      grupos GET        /grupos(.:format)          grupos#index
             POST       /grupos(.:format)          grupos#create
   new_grupo GET        /grupos/new(.:format)      grupos#new
  edit_grupo GET        /grupos/:id/edit(.:format) grupos#edit
       grupo GET        /grupos/:id(.:format)      grupos#show
             PATCH      /grupos/:id(.:format)      grupos#update
             PUT        /grupos/:id(.:format)      grupos#update
             DELETE     /grupos/:id(.:format)      grupos#destro

最后一点,您应该使用form_for @grupo而不是form_for :gropo。这样,您的表单字段就可以从@grupo

中的匹配属性动态填充

答案 1 :(得分:0)

试试这个:

<%= form_for :grupo, url: :grupo_path do |f| %>
    <p>Edição de Grupos</p>
    <%= f.label :descricao, "Descrição:" %>:
    <%= f.text_field :descricao, :size => 40 %>
    <%= f.submit "Alterar Dados" %>
<% end %>

此外,您确实需要match行的路线。 resources :grupos将为您承保。

删除:

match 'grupos/:id', controller: 'grupos', action: 'show', via: 'get'
match 'grupos/:id/edit', controller: 'grupos', action: 'edit', via: 'get'
match 'grupos/:id/edit', controller: 'grupos', action: 'update', via: 'post'