路由错误 - 没有路由匹配[PATCH]但是资源已定义

时间:2016-01-03 03:10:58

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

尝试设置编辑表单时,我在rails应用中遇到错误:

ActionController::RoutingError (No route matches [PATCH] "/contact.5")

当我在编辑视图中检查我的表单时,我发现操作也是错误的

<form class="edit_contact" id="edit_contact_5" action="/contact.5" ...

我在我的联系人控制器的路线文件中创建了一个完整的资源:

resources :contacts

当我rake routes时,我会收到以下联系人:

contact  GET    /contact(.:format)           static_pages#contact
contacts GET    /contacts(.:format)          contacts#index
         POST   /contacts(.:format)          contacts#create
new_contact GET    /contacts/new(.:format)      contacts#new
edit_contact GET    /contacts/:id/edit(.:format) contacts#edit
         GET    /contacts/:id(.:format)      contacts#show
         PATCH  /contacts/:id(.:format)      contacts#update
         PUT    /contacts/:id(.:format)      contacts#update
         DELETE /contacts/:id(.:format)      contacts#destroy

我有一个共享表单,用于在app / views / shared / _contact_form.html.erb中创建和编辑联系人。此表单正确显示新操作和编辑操作。此表单正在正确保存新联系人,但在尝试更新联系人时会抛出上述错误。

<%= form_for(@contact) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>
  ...
  <%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>

我的编辑视图调用了这样的部分:

<% provide(:title, 'Edit Contact') %>
<% provide(:button_text, 'Update Contact') %>

<h1>Update <%= @contact.name =%></h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render 'shared/contact_form' %>
  </div>
</div>

以下是控制器中的编辑和更新操作:

def edit
  @contact = Contact.find(params[:id])
end

def update
  @contact = Contact.find(params[:id])
  if @contact.update_attributes(contact_params)
    flash[:success] = "Contact Updated"
    redirect_to current_user
  else
    render 'edit'
  end
end

我正在使用相同的模式来创建和更新我的用户,它似乎工作得很好。这似乎应该是非常直接的。任何人都可以帮我发现我的错误吗?

1 个答案:

答案 0 :(得分:2)

啊,是的,在routes.rb。

中存在冲突

result.setVisibility(View.GONE); 所做的相当于:

form_for(@contact)

[1] http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for

根据屏幕截图,您列出了单一form_for @contact, as: :contact, url: contact_path(@contact), method: :patch, html: { class: "edit_contact", id: "edit_contact_45" }路由,它看起来优先于contact => static_pages#contact资源路径,特别是为contacts操作生成的路径。< / p>

如果您删除或修改update路线与static_pages#contact路线不冲突,则您的编辑/更新表单应该有效。