Поиск текущего URL-адреса или «основного» контроллера из Turbo Frame в Rails

На моей странице есть Turbo Frame, который использует src атрибут для загрузки /chats/. В этом кадре я хочу знать, использует ли главная страница show действие groups контроллер, то есть URL-адрес страницы находится по адресу /groups/group_name.

С использованием current_page?(controller: 'groups', action: 'show') возвращает false, поскольку видит себя как в chatsконтроллер. Как мне обойти это?

1 ответ

Решение

Вот варианты, которые я нашел:

Похоже, что нет встроенного способа доступа к классу / действию контроллера так, как вы описываете, но вы можете получить доступ к URL-адресу страницы, которая инициировала запрос Turbo (groups_controller#show) через request.referrer. Это будет полный URL-адрес страницы, например http://localhost:3000/groups/1/show.

  1. использовать параметры запроса

Это требует изменений для просмотра кода (вы должны добавить параметры запроса ко всем ссылкам, где вам нужна эта функция), но это позволяет вам передавать имена контроллеров / действий и любые другие произвольные данные, которые вы хотите.

Пример:

в application_controller.rb:

      # define a method to capture the information you wish to access during your Turbo stream request
def current_route_info
  {
    path: current_path,
    controller: params[:controller],
    action: params[:action]
  }
end

В этом примере не нужно прикасаться к контроллеру групп.

в show.html.erb (страница, которая отправляет запрос Turbo)

      <%= form_with url: turbo_view_path(info: current_route_info) do %>
...
<% end %>
OR
<%= link_to turbo_view_path(info: current_route_info) do %>
...
<% end %>
OR
<!-- you could also manually build the URL & encode the query params if you need to avoid URL helpers-->
<turbo-frame id="" src=chats_partial_path(info: current_route_info)>
...
<turbo-frame>

частичный контроллер chats(который обрабатывает запросы Turbo)

      def turbo_view_method
  params[:info]
  # => info as defined in current_route_info
end
  1. использовать

Я только что узнал, как можно использовать flashдля этого типа функциональности, которая распространяется на запросы. Это меньше работы, чем использование параметров запроса, в основном потому, что вам не нужно настраивать код представления.

Пример:

контроллер групп (который отображает представление шоу, которое отправляет запросы Turbo)

      def show
  # stick the current controller and action params into flash
  # again, you can add any other arbitrary (primitive) data you'd like
  flash[:referrer] = params.slice(:controller, :action)
  ...
  ...
end

частичный контроллер chats(который обрабатывает запросы Turbo)

      def chats_turbo_method
  flash[:referrer]
  # => { controller: "some_controller", action: "show" }
  # NOTE: flash will retain this :referrer key for exactly 1 further request.
  # If you require this info for multiple Turbo requests,
  # you must add:
  flash.keep(:referrer)
  # and you will have access to flash[:referrer] for as many Turbo requests as you want to make from group#show
end
Другие вопросы по тегам