我开始学习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
感谢您的关注。
答案 0 :(得分:0)
首先,应该为对象创建保留POST
个动作,而不是更新。使用PUT
或PATCH
进行更新。
此外,您的控制器(edit
,update
和destroy
)中的关键操作是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'