Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Когда использовать path в link_to?

#ruby_on_rails


<% @products.each do |product| %>
  <%= link_to 'Show', product %>
  <%= link_to 'Edit', edit_product_path(product) %>
  <%= link_to 'Destroy', product, method: :delete,
                  data: { confirm: 'Are you sure?' } %>
<% end %>


<%= link_to 'Edit', edit_product_path(@product) %> |
<%= link_to 'Back', products_path %>


Почему для show и destroy не используется product_path, а в оcтальных случаях path
используется
    


Ответы

Ответ 1



Если в рельсовый хелпер link_to передать в качестве параметра ресурс (например, объект ActiveRecord) - хелпер сам построит путь до него. Для этого link_to передает параметры в метод url_for, который строит путь по указанным параметрам. Например: <%= link_to 'Show', product %> вернет путь /products/1, где 1 - это id ресурса. А если указать массив вида [:admin, product] - это создаст ссылку на /admin/products/1. А если - массив вида [:admin, :products] - создаст ссылку на /admin/products. Подобным образом вы можете задавать ссылки и в контроллерах, например, redirect_to [:edit, product] В итоге в ваших вьюхах вы можете заменить... <%= link_to 'Edit', edit_product_path(@product) %> | <%= link_to 'Back', products_path %> ...на... <%= link_to 'Edit', [:edit, @product] %> | <%= link_to 'Back', :products %> ...и результат не изменится.

Ответ 2



Маршруты, выдаваемые рельсовым хелпером resources, можно разделить на две группы: Прямые действия (запрос с которым осмысленен с точки зрения семантики HTTP): index: GET коллекции create: POST ресурса show: GET ресурса update: PATCH ресурса (или PUT, хотя правильность семантики Rails тут под вопросом) destroy: DELETE ресурса ...и вспомогательные заглушки, которые нужны исключительно потому, что "надо рассказать браузеру, как совершить действие": new: интерфейс к create edit: интерфейс к update Прямые действия используют просто путь к тому, над чем производится действие, а само действие опознаётся из HTTP-метода. Но для "заглушек" осмысленных HTTP-методов нет, поэтому они используют пути "с хвостиком". А поскольку хелпер возвращает только путь (но не метод!), для прямых действий путь можно собрать прямо их объекта ресурса, а для заглушек нужен хелпер или объект с "подсказкой". Поскольку форма "подсказок" у маршрутной системы малоизвестна и имеет очень неочевидный синтаксис, её часто избегают в пользу хелперов, но это вопрос стиля.

Ответ 3



Вообще хэлпер link_to принимает путь, который можно получить при помощи path-хэлперов. Однако в том случае, когда редактируется или удаляется один объект ActionPack может автоматически сформировать путь. Ничто не мешает вам использовать хэлепер и в этом случае <%= link_to 'Show', product_path(product) %> Однако так получается длиннее.

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

Отправить комментарий