在 Rails 中的 Turbo 框架中查找当前 URL 或"main"控制器



我的页面上有一个Turbo Frame,它使用src属性在/chats/中加载。在此框架内,我希望能够知道main页面是否正在使用groups控制器的show操作,即页面的URL位于/groups/group_name

使用current_page?(controller: 'groups', action: 'show')返回false,因为它认为自己在chats控制器中。我该如何解决这个问题?

以下是我找到的选项:

  1. request.referrer

似乎没有像您描述的那样内置的方法来访问控制器类/操作,但您可以通过request.referrer访问启动Turbo请求的页面的URL(groups_controller#show(。这将是页面的完全限定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>

聊天部分控制器(处理Turbo请求(

def turbo_view_method
params[:info]
# => info as defined in current_route_info
end
  1. 使用flash

我刚刚了解了将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

聊天部分控制器(处理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

相关内容

  • 没有找到相关文章

最新更新