没有路线匹配 [PATCH]“/users/1/edit”
No route matches [PATCH] "/users/1/edit"
我是 rails 的新手,目前在学习 rails 教程时遇到问题。我在示例应用程序的第 10 章。我检查以确保资源 :users 包含在 routes.rb 配置文件中,但我仍然遇到此错误 - 请帮助!
No route matches [PATCH] "/users/1/edit".
运行 rails 路线收益率
Prefix Verb URI Pattern Controller#Action
root GET / static_pages#home
help GET /help(.:format) static_pages#help
about GET /about(.:format) static_pages#about
contact GET /contact(.:format) static_pages#contact
signup GET /signup(.:format) users#new
POST /signup(.:format) users#create
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
我的文件配置如下:
config/routes.rb
Rails.application.routes.draw do
root 'static_pages#home'
get '/help', to: 'static_pages#help'
get '/about', to: 'static_pages#about'
get '/contact', to: 'static_pages#contact'
get '/signup', to: 'users#new'
post '/signup', to: 'users#create'
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
resources :users
end
models/user.rb
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
/users/_form.html.erb
<%= form_for(@user, url: yield(:url)) do |f| %>
<%= render 'shared/error_messages', object: @user %>
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
<%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>
users/new.html.erb
<% provide(:title, 'Sign up') %>
<% provide(:button_text, 'Create my account') %>
<% provide(:url, signup_path) %>
<h1>Sign up</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= render 'form' %>
</div>
</div>
users/edit.html.erb
<% provide(:title, 'Edit user') %>
<% provide(:button_text, 'Save changes') %>
<% provide(:url, edit_user_path(@user)) %>
<h1>Update your profile</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= render 'form' %>
<div class="gravatar_edit">
<%= gravatar_for @user %>
<a href="http://gravatar.com/emails" target="_blank" rel="noopener">Change</a>
</div>
</div>
</div>
您尝试访问编辑控制器操作的方式与您已有的路由模式不一致。试试这个:
Rails.application.routes.draw do
root 'static_pages#home'
get '/help', to: 'static_pages#help'
get '/about', to: 'static_pages#about'
get '/contact', to: 'static_pages#contact'
get '/signup', to: 'users#new'
post '/signup', to: 'users#create'
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
patch '/users/:id/edit', to: 'users#edit'
resources :users
end
您不应该通过 PATCH 进行编辑。你应该做一个补丁来更新。
<% provide(:url, user_path(@user)) %>
按照惯例,您通常会在控制器上调用编辑(GET 方法到 edit_user_path(@user),您正在这样做。这会导致 edit.html.erb 被渲染,进而渲染表单。然后,表单本身应通过 users_path(@user) 上的 PATCH 方法调用控制器上的更新操作(而不是编辑操作)。url 与 [=27] 相同=](创建新用户时),以便您可以删除行
<% provide(:url, user_path(@user)) %>
并将 form_for 更改为仅使用 users_path
<%= form_for(@user, url: user_path) do |f| %>
请注意不要使用 'users_path',因为该链接指向用户索引,您会收到错误消息,因为该路由没有可用的 PATCH 方法。
@David 有一个很好的答案,但是以这种方式修复它会破坏注册表单(及其相关的测试)。
修复此模块的方法是将 edit.html.erb 中的提供更改为用户路径,如下所示:
更改自:
<% provide(:url, edit_user_path(@user)) %>
至
<% provide(:url, user_path(@user)) %>
我是 rails 的新手,目前在学习 rails 教程时遇到问题。我在示例应用程序的第 10 章。我检查以确保资源 :users 包含在 routes.rb 配置文件中,但我仍然遇到此错误 - 请帮助!
No route matches [PATCH] "/users/1/edit".
运行 rails 路线收益率
Prefix Verb URI Pattern Controller#Action
root GET / static_pages#home
help GET /help(.:format) static_pages#help
about GET /about(.:format) static_pages#about
contact GET /contact(.:format) static_pages#contact
signup GET /signup(.:format) users#new
POST /signup(.:format) users#create
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
我的文件配置如下:
config/routes.rb
Rails.application.routes.draw do
root 'static_pages#home'
get '/help', to: 'static_pages#help'
get '/about', to: 'static_pages#about'
get '/contact', to: 'static_pages#contact'
get '/signup', to: 'users#new'
post '/signup', to: 'users#create'
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
resources :users
end
models/user.rb
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
/users/_form.html.erb
<%= form_for(@user, url: yield(:url)) do |f| %>
<%= render 'shared/error_messages', object: @user %>
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
<%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>
users/new.html.erb
<% provide(:title, 'Sign up') %>
<% provide(:button_text, 'Create my account') %>
<% provide(:url, signup_path) %>
<h1>Sign up</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= render 'form' %>
</div>
</div>
users/edit.html.erb
<% provide(:title, 'Edit user') %>
<% provide(:button_text, 'Save changes') %>
<% provide(:url, edit_user_path(@user)) %>
<h1>Update your profile</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= render 'form' %>
<div class="gravatar_edit">
<%= gravatar_for @user %>
<a href="http://gravatar.com/emails" target="_blank" rel="noopener">Change</a>
</div>
</div>
</div>
您尝试访问编辑控制器操作的方式与您已有的路由模式不一致。试试这个:
Rails.application.routes.draw do
root 'static_pages#home'
get '/help', to: 'static_pages#help'
get '/about', to: 'static_pages#about'
get '/contact', to: 'static_pages#contact'
get '/signup', to: 'users#new'
post '/signup', to: 'users#create'
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
patch '/users/:id/edit', to: 'users#edit'
resources :users
end
您不应该通过 PATCH 进行编辑。你应该做一个补丁来更新。
<% provide(:url, user_path(@user)) %>
按照惯例,您通常会在控制器上调用编辑(GET 方法到 edit_user_path(@user),您正在这样做。这会导致 edit.html.erb 被渲染,进而渲染表单。然后,表单本身应通过 users_path(@user) 上的 PATCH 方法调用控制器上的更新操作(而不是编辑操作)。url 与 [=27] 相同=](创建新用户时),以便您可以删除行
<% provide(:url, user_path(@user)) %>
并将 form_for 更改为仅使用 users_path
<%= form_for(@user, url: user_path) do |f| %>
请注意不要使用 'users_path',因为该链接指向用户索引,您会收到错误消息,因为该路由没有可用的 PATCH 方法。
@David 有一个很好的答案,但是以这种方式修复它会破坏注册表单(及其相关的测试)。 修复此模块的方法是将 edit.html.erb 中的提供更改为用户路径,如下所示:
更改自:
<% provide(:url, edit_user_path(@user)) %>
至
<% provide(:url, user_path(@user)) %>