Поиск текущего 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
.
- использовать параметры запроса
Это требует изменений для просмотра кода (вы должны добавить параметры запроса ко всем ссылкам, где вам нужна эта функция), но это позволяет вам передавать имена контроллеров / действий и любые другие произвольные данные, которые вы хотите.
Пример:
в 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
- использовать
Я только что узнал, как можно использовать
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