Не найдено ни одного маршрута [POST] - Добавление маршрута не работает - PullRequest
0 голосов
/ 25 сентября 2018

Мой метод не работает.

У меня есть библиотека игр, где я могу добавлять, показывать, редактировать и уничтожать.Я хочу расширить его и добавить еще один метод clone.

Библиотека, созданная с помощью rails g scaffold:

Метод клонирования в games_controller.rb

def clone
  @game.clone

  respond_to do |format|
    format.html { redirect_to games_url, notice: 'Game was successfully cloned.'}
    format.json { head :no_content }
  end
end

Код вызова для Clone в индексе

<% @games.each do |game| %>
  <tr>
    <td><%= game.title %></td>
    <td><%= game.description %></td>
    <td><%= link_to 'Show', game %></td>
    <td><%= link_to 'Edit', edit_game_path(game) %></td>
    <td><%= link_to 'Destroy', game, method: :delete, data: { confirm: '.. sure?' } %></td>
    <td><%= link_to 'Clone', game, method: :clone, data: { confirm: '.. sure?' } %></td>
  </tr>
<% end %>

Код маршрута в rout.rb

resources :games do
  resources :comments
  post 'clone'
end

представление в библиотеке игр

1 Ответ

0 голосов
/ 25 сентября 2018

Вы делаете это неправильно.У вас есть method: :clone, что недействительно .Допустимые значения для опции method для link_to: отправка, исправление, установка и удаление .

метод:символ HTTP-глагола - этот модификатор будет динамически создавать форму HTML и немедленно отправлять форму для обработки с использованием указанного глагола HTTP.Полезно для того, чтобы ссылки выполняли операцию POST в опасных действиях, таких как удаление записи (за которой могут следовать поисковые роботы, паукорируя ваш сайт). Поддерживаются следующие глаголы: post,: delete,: patch и: put .Обратите внимание, что если у пользователя отключен JavaScript, запрос вернется к использованию GET.Если используется href: '#' и у пользователя отключен JavaScript, нажатие на ссылку не даст никакого эффекта.Если вы полагаетесь на поведение POST, вы должны проверить его в действии вашего контроллера, используя методы объекта запроса для post ?, delete ?, patch? Или put?.

Теперь перейдем кваши маршруты, когда вы делаете rake routes, вы увидите ниже

game_clone     POST   /games/:game_id/clone(.:format)     games#clone

Таким образом, link_to должно выглядеть следующим образом

<%= link_to 'Clone', game_clone_path(game), method: :post, data: { confirm: '.. sure?' } %>

Не удалось найтиИгра без ID

Хорошо, вы клонируете экземпляр Game.Обычно вы ищите экземпляр с :id, но с вашими текущими маршрутами :game_id будет передан в params, что не соответствует вашим потребностям.Вы должны изменить свои маршруты, чтобы пройти :id вместо :game_id.Таким образом, окончательное решение будет

Окончательное решение:

resources :games do
  resources :comments
  post 'clone', on: :member
end

Приведенное выше создаст вспомогательный путь со следующими значениями:

clone_game POST   /games/:id/clone(.:format)    games#clone

Сейчасизмените link_to с новым помощником пути, и вы готовы идти

<%= link_to 'Clone', clone_game_path(game), method: :post, data: { confirm: '.. sure?' } %>

Примечание:

Будьте осторожны при добавлении пользовательских маршрутов на ваши изобретательные маршруты.Это создаст помощников пути с ненужными ключами, такими как :*_id (:game_id в вашем случае).Эти маршруты должны быть добавлены как маршрут сбора или маршрут участника в зависимости от сценария.Для получения дополнительной информации см. Эти направляющие

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...