Ruby on Rails: link_to vs button_to - PullRequest
0 голосов
/ 23 мая 2019

У меня проблемы с реализацией метода link_to. Моя программа использует ссылку для вызова метода контроллера, который выполняет некоторую логику и отображает часть. Проблема в том, что я не могу получить ссылку для вызова метода контроллера. Я попытался вызвать тот же метод контроллера с button_to, и он, кажется, работает. Глядя на API обоих вспомогательных методов ActionView button_to и link_to, кажется, что параметры должны быть одинаковыми. Однако следующие две строки кода делают две разные вещи.

_product.html.erb

<%= link_to 'view individual', products_view_individual_product_page_path(product_id: product.id)%>
<%= button_to 'view individual', products_view_individual_product_page_path(product_id: product.id)%>

Вызов link_to вызовет ошибку ActiveRecord :: RecordNotFound: «Не удалось найти продукт с 'id' = view_individual_product_page", а переданные параметры: {"product_id" => "261", "id" => " view_individual_product_page "}, я не уверен, почему он пытается передать путь моего метода контроллера в качестве идентификатора. Однако строка кода button_to работает просто отлично, и я в указанном методе контроллера. Вот запись маршрута в моем файле rout.rb ...

routes.rb

post 'products/view_individual_product_page'

Может кто-нибудь объяснить мне, что я делаю здесь неправильно, я не могу найти много информации в Интернете о том, почему путь передается в виде идентификатора в link_to, но не button_to

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Добавить method: :post в качестве опции для link_to.

link_to 'view individual', products_view_individual_product_page_path(product_id: product.id), method: :post

Теги «A» всегда выполняют GET-запросы, и вы ожидаете POST-запрос. Обратите внимание, что вам нужен Rails Unobtrusive Javascript для ссылок, чтобы инициировать POST-запрос, когда Rails делает некоторые закулисные шаги (проверьте ваш javascript application.js, у вас должен быть require rails-ujs).

Обычно, если вам нужно сделать POST-запрос, то все равно будет иметь button_to, поскольку он фактически отображает тег FORM с кнопкой для выполнения правильного POST-запроса без необходимости в Rails UJS.

Проверьте документ для обоих: https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/UrlHelper.html#method-i-button_to https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

1 голос
/ 23 мая 2019

Я думаю, что разница в том, что link_to по умолчанию использует метод GET, где button_to использует POST.Поэтому, если вы хотите другой метод, укажите его

<%= link_to 'view individual', products_view_individual_product_page_path(product_id: product.id), method: :post %>
...