ActionController:: UrlGenerationError в статьях # edit

Я получаю следующую ошибку:

Нет сопоставлений маршрутов {: action = > "show",: controller = > "articles",: id = > nil} отсутствуют необходимые ключи: [: id]

Ниже приведен код, где отображается ошибка.

<%= form_for :article, url: article_path(@article), method: :patch do |f| %>

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

Вот мои выходные маршруты маршрута

     Prefix Verb   URI Pattern                  Controller#Action
welcome_index GET    /welcome/index(.:format)     welcome#index
     articles GET    /articles(.:format)          articles#index
              POST   /articles(.:format)          articles#create
  new_article GET    /articles/new(.:format)      articles#new
 edit_article GET    /articles/:id/edit(.:format) articles#edit
      article GET    /articles/:id(.:format)      articles#show
              PATCH  /articles/:id(.:format)      articles#update
              PUT    /articles/:id(.:format)      articles#update
              DELETE /articles/:id(.:format)      articles#destroy
         root GET    /                            welcome#index

Ответ 1

Если вы посмотрите на свой вопрос

<%= form_for :article, url: article_path(@article), method: :patch do |f| %>

Проверьте свой url: article_path (@article), это помощник пути для действия вашей статьи и если вы проверяете свои маршруты рейка, которые он говорит для действия show, вам нужен запрос get, но вы используете метод patch или если вы пытаетесь отредактировать статью, то ваш помощник пути ошибочен и, следовательно, нет ошибки маршрута

Fix

Чтобы показать статью:

Если вы хотите показать статью, то вместо form_for use link_to, которая по умолчанию использует запрос get, form_for используется для создания статьи, а не для показа статьи

<%= link_to "Article", articles_path(@article) %>

Чтобы создать или отредактировать статью:

а. Использование полиморфных URL

Если вы хотите создать статью или отредактировать статью, вы можете использовать rails polymorphic urls и не нужно указывать опцию url, рельсы будут обрабатывать ее внутренне. Поэтому для создания и редактирования статьи вы можете использовать ту же форму

<%= form_for @article do |f| %>
  // your fields
<% end %>

Для этого вам нужно иметь это в своем контроллере

def new
  @article = Article.new
end

def edit
  @article = Article.find(params[:id])
end

б. Использование path_helpers

Если вы будете указывать URL-адрес в своей форме, то он перенесет вас только на это действие и, следовательно, вам потребуются отдельные формы

Для создания:

<%= form_for :article, url: article_path do |f| %>
  // your fields
<% end %>

Для редактирования:

<%= form_for :article, url: article_path(@article) do |f| %>
  // your fields
<% end %>