Нет совпадений маршрута [PATCH] «/ users / 1 / edit»

#ruby-on-rails #routing #railstutorial.org

#ruby-on-rails #маршруты #railstutorial.org

Вопрос:

Я новичок в rails, и в настоящее время у меня возникают проблемы при прохождении руководства по rails. Я нахожусь в главе 10 примера приложения. Я проверил, чтобы убедиться, что resources :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
  

модели/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>
  

Ответ №1:

Вы не должны делать ИСПРАВЛЕНИЕ для редактирования. Вы должны выполнить ИСПРАВЛЕНИЕ для обновления.

 <% provide(:url, user_path(@user)) %>
  

По соглашению вы обычно вызываете edit на своем контроллере (метод GET для edit_user_path(@user), что вы и делаете. Это приводит к отображению вашего edit.html.erb, который, в свою очередь, отображает форму. Затем сама форма должна вызвать действие обновления на контроллере (а не действие редактирования) методом PATCH для users_path (@user). URL-адрес такой же, как для сообщения (при создании нового пользователя), поэтому вы можете удалить строку

 <% provide(:url, user_path(@user)) %>
  

и измените form_for, чтобы просто использовать users_path

 <%= form_for(@user, url: user_path) do |f| %>
  

Обратите внимание, чтобы не использовать ‘users_path’, поскольку он ссылается на индекс пользователей, и вы получите сообщение об ошибке, поскольку для этого маршрута не доступен метод ИСПРАВЛЕНИЯ.

Комментарии:

1. Я люблю тебя. В конце концов я тоже разобрался с этой частью, пролив несколько слез.

2. Ха-ха, я уверен, что к концу этого урока у меня будет совершенно новый гардероб пожертвования. Большое спасибо.

3. все экземпляры «users_path» здесь должны быть «user_path».

Ответ №2:

у @David был хороший ответ, однако исправление его таким образом нарушает форму регистрации (и связанное с ней тестирование). Способ исправить это для этого модуля — изменить provide в edit.html.erb на user-path, например:

Изменить с:

 <% provide(:url, edit_user_path(@user)) %>
  

Для

 <% provide(:url, user_path(@user)) %>
  

Ответ №3:

способ, которым вы пытаетесь получить доступ к действию контроллера редактирования, не соответствует шаблону маршрутизации, который у вас уже есть. Попробуйте это:

 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
  

Комментарии:

1. Это ты классный, это работает! Я больше не получаю сообщение об ошибке маршрутизации, но страница не выполняет перенаправление на @user после обновления? Мне придется выполнить еще один поиск! потрясающе!

2. Без проблем, я рад, что смог помочь, не стесняйтесь принять ответ 🙂